GENERIC from Sun May 24 23:59:02 2009 +0300, vm3 989b0f5, vmcore.157 KDB: debugger backends: ddb KDB: current backend: ddb 524288K of memory above 4GB ignored Copyright (c) 1992-2009 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD is a registered trademark of The FreeBSD Foundation. FreeBSD 8.0-CURRENT #0: Mon May 25 07:02:01 CEST 2009 pho@x4.osted.lan:/var/tmp/deviant2/sys/i386/compile/PHO WARNING: WITNESS option enabled, expect reduced performance. WARNING: DIAGNOSTIC option enabled, expect reduced performance. Timecounter "i8254" frequency 1193182 Hz quality 0 CPU: AMD Phenom(tm) 9150e Quad-Core Processor (1799.99-MHz 686-class CPU) Origin = "AuthenticAMD" Id = 0x100f23 Stepping = 3 Features=0x178bfbff Features2=0x802009 AMD Features=0xee500800 AMD Features2=0x7ff TSC: P-state invariant real memory = 4294967296 (4096 MB) avail memory = 1032327168 (984 MB) : Trying to mount root from ufs:/dev/ad4s1a WARNING: / was not properly dismounted Entropy harvesting: interrupts ethernet point_to_point kickstart. /etc/rc: WARNING: Use of the early.sh script is deprecated /etc/rc: WARNING: Please use a new-style rc.d script instead /etc/rc: WARNING: See rc(8) for more information GEOM_LABEL: Label ufsid/48f38e3cff1ca3a5 removed. ** /dev/ad4s1e ** Last Mounted on /tmp ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Cyl groups 19642 files, 693470 used, 50083605 free (2317 frags, 6260161 blocks, 0.0% fragmentation) ***** FILE SYSTEM MARKED CLEAN ***** GEOM_LABEL: Label for provider ad4s1e is ufsid/48f38e3cff1ca3a5. GEOM_LABEL: Label ufsid/48f38e3c5b611e96 removed. /dev/ad4s1a: 17808 files, 759779 used, 253236 free (2556 frags, 31335 blocks, 0.3% fragmentation) GEOM_LABEL: Label for provider ad4s1a is ufsid/48f38e3c5b611e96. GEOM_LABEL: Label ufsid/48f38e3cff1ca3a5 removed. /dev/ad4s1e: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/ad4s1e: clean, 50083605 frGEOM_LABEL:ee (2317 frags, 6260161 blocks, Label for provider ad4s1e is ufsid/48f38e3cff1ca3a5.0.0% fragmentati on) GEOM_LABEL: Label ufsid/48f38e47737647c8 removed. /dev/ad4s1f: 2248553 files, 15929279 used, 6409494 free (209206 frags, 775036 blocks, 0.9% fragmentation) GEOM_LABEL: Label for provider ad4s1f is ufsid/48f38e47737647c8. GEOM_LABEL: Label ufsid/48f38e4956403ff8 removed. /dev/ad4s1d: UNREF FILE I=4592987 OWNER=root MODE=100600 /dev/ad4s1d: SIZE=0 MTIME=May 24 18:09 2009 (CLEARED) /dev/ad4s1d: FREE BLK COUNT(S) WRONG IN SUPERBLK (SALVAGED) /dev/ad4s1d: SUMMARY INFORMATION BAD (SALVAGED) /dev/ad4s1d: BLK(S) MISSING IN BIT MAPS (SALVAGED) /dev/ad4s1d: 896724 files, 42452150 used, 8324925 free (107021 frags, 1027238 blocks, 0.2% fragmentation) GEOM_LABEL: Label for provider ad4s1d is ufsid/48f38e4956403ff8. GEOM_LABEL: Label ufsid/48f38e3c5b611e96 removed. GEOM_LABEL: Label ufsid/48f38e3cff1ca3a5 removed. GEOM_LABEL: Label ufsid/48f38e47737647c8 removed. GEOM_LABEL: Label ufsid/48f38e4956403ff8 removed. re0: link state changed to DOWN Starting Network: lo0 re0. add net default: gateway 192.168.1.1 savecore: reboot after panic: uilomove EFAULT 282ock order rever3c000 2807ed60 4sal: 096 May 25 11:1 1st 0xe4512194 2:03 x4 savecorebufwait (bufwait: reboot after p) @ kernanic: uiomove EF/vfs_bio.c:2556AULT 2823c000 28 07ed60 4096 2nd 0xc4fb5200 dirhash (dirhash) @ ufs/ufs/ufs_dirhash.c:275 KDB: stack backtrace: db_trace_self_wrapper(c0c3ba85,f3839778,c08a03f5,c089212b,c0c3e93c,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c089212b,c0c3e93c,c4528cf0,c452c0f0,f38397d4,...) at kdb_backtrace+0x29 _witness_debugger(c0c3e93c,c4fb5200,c0c5e280,c452c0f0,c0c5df26,...) at _witness_debugger+0x25 witness_checkorder(c4fb5200,9,c0c5df1d,113,0,...) at witness_checkorder+0x839 _sx_xlock(c4fb5200,0,c0c5df1d,113,c4fbad24,...) at _sx_xlock+0x85 ufsdirhash_acquire(e4512134,e4de3390,70,e4de33a4,f38398a4,...) at ufsdirhash_acquire+0x48 ufsdirhash_add(c4fbad24,f38398ec,13a4,f3839890,f3839894,...) at ufsdirhash_add+0x13 ufs_direnter(c4fb0c84,c4fb06f4,f38398ec,f3839bd4,0,...) at ufs_direnter+0x779 ufs_makeinode(f3839bd4,c0d3aaa0,f3839acc,f3839a34,c0b7b835,...) at ufs_makeinode+0x51f ufs_create(f3839acc,c0c73097,0,0,f3839ba8,...) at ufs_create+0x30 VOP_CREATE_APV(c0d3a660,f3839acc,2,c0c311ba,3,...) at VOP_CREATE_APV+0xc5 vn_open_cred(f3839ba8,f3839c5c,180,c4541300,c4c1fe38,...) at vn_open_cred+0x18e vn_open(f3839ba8,f3839c5c,180,c4c1fe38,c4c52b90,...) at vn_open+0x33 kern_openat(c4c52b90,ffffff9c,28300000,0,602,...) at kern_openat+0x108 kern_open(c4c52b90,28300000,0,601,180,...) at kern_open+0x35 open(c4c52b90,f3839cf8,c,c0c58c77,c0d1b438,...) at open+0x30 syscall(f3839d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x28174ee3, esp = 0xbfbfe2dc, ebp = 0xbfbfedf8 --- savecore: writing core to vmcore.156 Additional ABI support: linux. Starting mountd. Configuring syscons: keymap blanktime. Local package initialization: watchdogd. Mon May 25 11:12:50 CEST 2009 FreeBSD/i386 (x4.osted.lan) (console) login: lock order reversal: 1st 0xc52c1e40 ufs (ufs) @ kern/vfs_lookup.c:492 2nd 0xe4682d8c bufwait (bufwait) @ ufs/ffs/ffs_softdep.c:6150 3rd 0xc514f320 ufs (ufs) @ kern/vfs_subr.c:2103 KDB: stack backtrace: db_trace_self_wrapper(c0c3ba85,f39bd3e0,c08a03f5,c089212b,c0c3e955,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c089212b,c0c3e955,c4528cf0,c452c088,f39bd43c,...) at kdb_backtrace+0x29 _witness_debugger(c0c3e955,c514f320,c0c31ae3,c452c088,c0c457ea,...) at _witness_debugger+0x25 witness_checkorder(c514f320,9,c0c457e1,837,0,...) at witness_checkorder+0x839 __lockmgr_args(c514f320,80100,c514f388,0,0,...) at __lockmgr_args+0x7a7 ffs_lock(f39bd548,c08a019b,c0c44e87,80100,c514f2c8,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0d3a660,f39bd548,c54240a4,c0d52ee0,c514f2c8,...) at VOP_LOCK1_APV+0xa5 _vn_lock(c514f2c8,80100,c0c457e1,837,4,...) at _vn_lock+0x78 vget(c514f2c8,80100,c5424000,50,0,...) at vget+0xc9 vfs_hash_get(c4e45598,4a0801,80000,c5424000,f39bd6a4,...) at vfs_hash_get+0xed ffs_vgetf(c4e45598,4a0801,80000,f39bd6a4,1,...) at ffs_vgetf+0x49 softdep_sync_metadata(c52c1de8,0,c0c5db69,131,0,...) at softdep_sync_metadata+0x5ba ffs_syncvnode(c52c1de8,1,c5424000,f39bd764,246,...) at ffs_syncvnode+0x3e2 ffs_truncate(c52c1de8,200,0,880,c4cb6c00,...) at ffs_truncate+0x696 ufs_direnter(c52c1de8,c514f2c8,f39bda20,f39bdc04,e455b80c,...) at ufs_direnter+0x946 ufs_mkdir(f39bdc28,c0c72ed1,0,f39bdbd8,f39bdb70,...) at ufs_mkdir+0x8ce VOP_MKDIR_APV(c0d3a660,f39bdc28,eae,eac,0,...) at VOP_MKDIR_APV+0xc5 kern_mkdirat(c5424000,ffffff9c,804d7c0,0,1f8,...) at kern_mkdirat+0x23b kern_mkdir(c5424000,804d7c0,0,1f8,f39bdd2c,...) at kern_mkdir+0x2e mkdir(c5424000,f39bdcf8,8,c0c3f197,c0d1c080,...) at mkdir+0x29 syscall(f39bdd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (136, FreeBSD ELF32, mkdir), eip = 0x28172ea3, esp = 0xbfbfe5fc, ebp = 0xbfbfe698 --- May 25 11:16:28 x4 su: pho to root on /dev/pts/0 panic: uiomove EFAULT 2823a000 2807ed60 4096 cpuid = 0 KDB: enter: panic [thread pid 1443 tid 100237 ] Stopped at kdb_enter+0x3a: movl $0,kdb_why db:0:kdb.enter.panic> run pho db:1:pho> bt Tracing pid 1443 tid 100237 td 0xc5604000 kdb_enter(c0c38742,c0c38742,c0c5f91d,f3ab8710,0,...) at kdb_enter+0x3a panic(c0c5f91d,2823a000,0,2807ed60,0,...) at panic+0x136 vm_fault_hold(c4f42658,2823a000,2,8,0,...) at vm_fault_hold+0x6e vm_fault(c4f42658,2823a000,2,8,2823a000,...) at vm_fault+0x2f trap_pfault(5,0,c0c70307,c0c70813,c54e0a90,...) at trap_pfault+0x119 trap(f3ab8970) at trap+0x468 calltrap() at calltrap+0x6 --- trap 0xc, eip = 0xc0b6a01c, esp = 0xf3ab89b0, ebp = 0xf3ab89f8 --- slow_copyout(f3ab8a2c,0,1000,f3ab8c54,f3ab8a2c,...) at slow_copyout+0x4 proc_rwmem(c4cb8a90,f3ab8c54,c0c2ebd1,42,c4cb8a90,...) at proc_rwmem+0x100 procfs_doprocmem(c5604000,c4cb8a90,c48f2a80,0,f3ab8c54,...) at procfs_doprocmem+0x8a pfs_read(f3ab8ae8,c0c72706,c4c36658,f3ab8ae8,c5abd9bc,...) at pfs_read+0x240 VOP_READ_APV(c0d18c60,f3ab8ae8,c0c46c2f,27e,f3ab8c54,...) at VOP_READ_APV+0xc5 vn_read_wired_chunk(c4c36658,f3ab8c54,c4541300,0,0,...) at vn_read_wired_chunk+0xb1 do_vn_rw_chunked(0,0,c5604000,f3ab8b70,c08f9b30,...) at do_vn_rw_chunked+0xa7 vn_read(c4c36658,f3ab8c54,c4541300,0,c5604000,...) at vn_read+0x1b2 dofileread(f3ab8c54,ffffffff,ffffffff,0,c4c36658,...) at dofileread+0x96 kern_readv(c5604000,5,f3ab8c54,f3ab8c78,1,...) at kern_readv+0x58 read(c5604000,f3ab8cf8,c,c0c3f191,c0d1b408,...) at read+0x4f syscall(f3ab8d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x281988a3, esp = 0xbfbfdaac, ebp = 0xbfbfdef8 --- db:1:bt> show allpcpu Current CPU: 0 cpuid = 0 curthread = 0xc5604000: pid 1443 "ps" curpcb = 0xf3ab8d90 fpcurthread = 0xc5604000: pid 1443 "ps" idlethread = 0xc4576250: pid 11 "idle: cpu0" APIC ID = 0 currentldt = 0x50 spin locks held: cpuid = 1 curthread = 0xc45764a0: pid 11 "idle: cpu1" curpcb = 0xc41ced90 fpcurthread = none idlethread = 0xc45764a0: pid 11 "idle: cpu1" APIC ID = 1 currentldt = 0x50 spin locks held: cpuid = 2 curthread = 0xc45766f0: pid 11 "idle: cpu2" curpcb = 0xc41cbd90 fpcurthread = none idlethread = 0xc45766f0: pid 11 "idle: cpu2" APIC ID = 2 currentldt = 0x50 spin locks held: cpuid = 3 curthread = 0xc4576000: pid 12 "swi4: clock" curpcb = 0xc41d5d90 fpcurthread = none idlethread = 0xc4576940: pid 11 "idle: cpu3" APIC ID = 3 currentldt = 0x50 spin locks held: db:1:allpcpu> show alllocks Process 1345 (sshd) thread 0xc58f8250 (100248) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc520a6b8) locked @ kern/uipc_sockbuf.c:148 Process 1178 (sshd) thread 0xc5427940 (100143) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc51e16b8) locked @ kern/uipc_sockbuf.c:148 Process 1177 (sshd) thread 0xc4bab4a0 (100099) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc51e5088) locked @ kern/uipc_sockbuf.c:148 Process 1176 (sshd) thread 0xc4e66000 (100134) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc4e7b52c) locked @ kern/uipc_sockbuf.c:148 Process 1169 (sshd) thread 0xc4bab6f0 (100098) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc51e2088) locked @ kern/uipc_sockbuf.c:148 db:1:alllocks> show lockedvnods Locked vnodes db:1:lockedvnods> show mount 0xc4bc1b30 /dev/ad4s1a on / (ufs) 0xc4bc2000 devfs on /dev (devfs) 0xc4e45598 /dev/ad4s1e on /tmp (ufs) 0xc4e4b000 /dev/ad4s1f on /usr (ufs) 0xc4e4ab30 /dev/ad4s1d on /var (ufs) 0xc4e4a864 procfs on /proc (procfs) More info: show mount db:1:mount> ps pid ppid pgrp uid state wmesg wchan cmd 1444 1442 1 0 S piperd 0xc50c2000 sh 1443 1442 1 0 RL CPU 0 ps 1442 1440 1 0 S wait 0xc54c9a90 sh 1440 1427 1 0 S piperd 0xc4f3c780 sh 1433 1431 1 0 S nanslp 0xc0d86804 sleep 1431 1427 1 0 S wait 0xc5498548 sh 1427 1 1 0 S wait 0xc54cd7ec sh 1422 1188 1186 1001 S nanslp 0xc0d86804 sleep 1421 1406 1421 0 S+ ttyin 0xc4b48e70 csh 1406 1172 1406 1001 S+ wait 0xc4e5da90 su 1387 1386 1387 1001 Ss+ ttyin 0xc4c81070 bash 1386 1345 1345 1001 S select 0xc51498e4 sshd 1345 1082 1345 0 Ss sbwait 0xc520a6e4 sshd 1189 1186 1186 1001 SL piperd 0xc50bd600 awk 1188 1186 1186 1001 S wait 0xc4cb87ec sh 1187 1185 1187 1001 Ss+ select 0xc50f9b24 top 1186 1184 1186 1001 Ss wait 0xc4e8ea90 sh 1185 1177 1177 1001 S select 0xc5107864 sshd 1184 1178 1178 1001 S select 0xc510c524 sshd 1183 1182 1183 1001 Ss kqread 0xc4fc1800 tail 1182 1176 1176 1001 S select 0xc518a8e4 sshd 1178 1082 1178 0 Ss sbwait 0xc51e16e4 sshd 1177 1082 1177 0 Ss sbwait 0xc51e50b4 sshd 1176 1082 1176 0 Ss sbwait 0xc4e7b558 sshd 1172 1171 1172 1001 Ss+ wait 0xc4c15d34 bash 1171 1169 1169 1001 S select 0xc5159724 sshd 1169 1082 1169 0 Ss sbwait 0xc51e20b4 sshd 1134 1 1134 0 Ss select 0xc5113c64 inetd 1110 1 1110 0 Ss nanslp 0xc0d86804 watchdogd 1101 1 1101 0 Ss nanslp 0xc0d86804 cron 1095 1 1095 25 Ss pause 0xc4b1fae8 sendmail 1089 1 1089 0 Ss select 0xc515a124 sendmail 1082 1 1082 0 Ss select 0xc5112864 sshd 1045 1 1045 0 Ss select 0xc50ddaa4 ntpd 924 1 924 0 Ss rpcsvc 0xc510a910 NLM: master 918 1 918 0 Ss select 0xc51174e4 rpc.statd 909 908 908 0 S (threaded) nfsd 100140 S rpcsvc 0xc5159390 nfsd: service 100139 S rpcsvc 0xc5108cd0 nfsd: service 100138 S rpcsvc 0xc5159a50 nfsd: service 100080 S rpcsvc 0xc5159310 nfsd: master 908 1 908 0 Ss select 0xc510f564 nfsd 906 1 906 0 Ss select 0xc5110d24 mountd 824 1 824 0 Ss select 0xc51597a4 rpcbind 794 1 794 0 Ss select 0xc4c3c764 syslogd 599 1 599 0 Ss select 0xc4a6dca4 devd 44 0 0 0 SL flowclea 0xc0d86664 [flowcleaner] 43 0 0 0 SL sdflush 0xc0efe8a0 [softdepflush] 42 0 0 0 SL syncer 0xc0ef30d4 [syncer] 41 0 0 0 SL vlruwt 0xc4b38548 [vnlru] 40 0 0 0 SL psleep 0xc0ef2e08 [bufdaemon] 39 0 0 0 SL pgzero 0xc0eff4d4 [pagezero] 38 0 0 0 SL psleep 0xc0eff0fc [vmdaemon] 9 0 0 0 SL psleep 0xc0eff0c4 [pagedaemon] 37 0 0 0 SL wmsg 0xc47dcd0c [usbus5] 36 0 0 0 SL wmsg 0xc47dccdc [usbus5] 35 0 0 0 SL wmsg 0xc47dccac [usbus5] 34 0 0 0 SL wmsg 0xc47dcc7c [usbus5] 33 0 0 0 SL wmsg 0xc47d6b5c [usbus4] 32 0 0 0 SL wmsg 0xc47d6b2c [usbus4] 31 0 0 0 SL wmsg 0xc47d6afc [usbus4] 30 0 0 0 SL wmsg 0xc47d6acc [usbus4] 29 0 0 0 SL wmsg 0xc47cdb5c [usbus3] 28 0 0 0 SL wmsg 0xc47cdb2c [usbus3] 27 0 0 0 SL wmsg 0xc47cdafc [usbus3] 26 0 0 0 SL wmsg 0xc47cdacc [usbus3] 25 0 0 0 SL wmsg 0xc47c9b5c [usbus2] 24 0 0 0 SL wmsg 0xc47c9b2c [usbus2] 23 0 0 0 SL wmsg 0xc47c9afc [usbus2] 22 0 0 0 SL wmsg 0xc47c9acc [usbus2] 21 0 0 0 SL wmsg 0xc47c3b5c [usbus1] 20 0 0 0 SL wmsg 0xc47c3b2c [usbus1] 19 0 0 0 SL wmsg 0xc47c3afc [usbus1] 18 0 0 0 SL wmsg 0xc47c3acc [usbus1] 17 0 0 0 SL wmsg 0xc47beb5c [usbus0] 16 0 0 0 SL wmsg 0xc47beb2c [usbus0] 15 0 0 0 SL wmsg 0xc47beafc [usbus0] 14 0 0 0 SL wmsg 0xc47beacc [usbus0] 8 0 0 0 SL waiting_ 0xc0ef4fbc [sctp_iterator] 7 0 0 0 SL - 0xc47cc43c [fdc0] 6 0 0 0 SL - 0xc47fd000 [fw0_probe] 5 0 0 0 SL ccb_scan 0xc0d53654 [xpt_thrd] 13 0 0 0 SL - 0xc0d86664 [yarrow] 4 0 0 0 SL - 0xc0d843e4 [g_down] 3 0 0 0 SL - 0xc0d843e0 [g_up] 2 0 0 0 SL - 0xc0d843d8 [g_event] 12 0 0 0 RL (threaded) intr 100042 I [irq12: psm0] 100041 I [irq1: atkbd0] 100039 I [swi0: uart] 100036 I [irq20: fwohci0] 100035 I [irq14: ata0] 100034 I [irq19: ehci0] 100033 I [irq18: ohci2 ohci4] 100032 I [irq17: ohci1 ohci3] 100031 I [irq16: hdac1 ohci0] 100030 I [irq22: atapci0] 100029 I [irq256: hdac0] 100028 I [irq9: acpi0] 100023 I [swi6: task queue] 100022 I [swi6: Giant taskq] 100020 I [swi5: +] 100019 I [swi2: cambio] 100012 I [swi3: vm] 100011 I [swi1: net] 100010 I [swi4: clock] 100009 I [swi4: clock] 100008 I [swi4: clock] 100007 Run CPU 3 [swi4: clock] 11 0 0 0 RL (threaded) idle 100006 CanRun [idle: cpu0] 100005 Run CPU 1 [idle: cpu1] 100004 Run CPU 2 [idle: cpu2] 100003 CanRun [idle: cpu3] 1 0 1 0 SLs wait 0xc4574d34 [init] 10 0 0 0 SL audit_wo 0xc0efe240 [audit] 0 0 0 0 SLs (threaded) kernel 100037 D - 0xc4805740 [fw0_taskq] 100027 D - 0xc4728040 [acpi_task_2] 100026 D - 0xc4728040 [acpi_task_1] 100025 D - 0xc4728040 [acpi_task_0] 100024 D - 0xc4728080 [kqueue taskq] 100021 D - 0xc47281c0 [thread taskq] 100016 D - 0xc455cc40 [firmware taskq] 100000 D sched 0xc0d844a0 [swapper] db:1:ps> allt Tracing command sh pid 1444 tid 100161 td 0xc50c96f0 sched_switch(c50c96f0,0,104,18c,4486b999,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,4c,...) at mi_switch+0x200 sleepq_switch(c50c96f0,0,c0c3ca92,189,4c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c50c2000,4c,c0c3ef32,100,0,...) at sleepq_wait_sig+0x17 _sleep(c50c2000,c50c2168,14c,c0c3ef32,0,...) at _sleep+0x344 pipe_read(c4cb29a0,f39b7c54,c4541300,0,c50c96f0,...) at pipe_read+0x3f7 dofileread(f39b7c54,ffffffff,ffffffff,0,c4cb29a0,...) at dofileread+0x96 kern_readv(c50c96f0,0,f39b7c54,f39b7c78,1,...) at kern_readv+0x58 read(c50c96f0,f39b7cf8,c,f39b7d38,c0d1b408,...) at read+0x4f syscall(f39b7d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x281e08a3, esp = 0xbfbfd86c, ebp = 0xbfbfd9a8 --- Tracing command ps pid 1443 tid 100237 td 0xc5604000 kdb_enter(c0c38742,c0c38742,c0c5f91d,f3ab8710,0,...) at kdb_enter+0x3a panic(c0c5f91d,2823a000,0,2807ed60,0,...) at panic+0x136 vm_fault_hold(c4f42658,2823a000,2,8,0,...) at vm_fault_hold+0x6e vm_fault(c4f42658,2823a000,2,8,2823a000,...) at vm_fault+0x2f trap_pfault(5,0,c0c70307,c0c70813,c54e0a90,...) at trap_pfault+0x119 trap(f3ab8970) at trap+0x468 calltrap() at calltrap+0x6 --- trap 0xc, eip = 0xc0b6a01c, esp = 0xf3ab89b0, ebp = 0xf3ab89f8 --- slow_copyout(f3ab8a2c,0,1000,f3ab8c54,f3ab8a2c,...) at slow_copyout+0x4 proc_rwmem(c4cb8a90,f3ab8c54,c0c2ebd1,42,c4cb8a90,...) at proc_rwmem+0x100 procfs_doprocmem(c5604000,c4cb8a90,c48f2a80,0,f3ab8c54,...) at procfs_doprocmem+0x8a pfs_read(f3ab8ae8,c0c72706,c4c36658,f3ab8ae8,c5abd9bc,...) at pfs_read+0x240 VOP_READ_APV(c0d18c60,f3ab8ae8,c0c46c2f,27e,f3ab8c54,...) at VOP_READ_APV+0xc5 vn_read_wired_chunk(c4c36658,f3ab8c54,c4541300,0,0,...) at vn_read_wired_chunk+0xb1 do_vn_rw_chunked(0,0,c5604000,f3ab8b70,c08f9b30,...) at do_vn_rw_chunked+0xa7 vn_read(c4c36658,f3ab8c54,c4541300,0,c5604000,...) at vn_read+0x1b2 dofileread(f3ab8c54,ffffffff,ffffffff,0,c4c36658,...) at dofileread+0x96 kern_readv(c5604000,5,f3ab8c54,f3ab8c78,1,...) at kern_readv+0x58 read(c5604000,f3ab8cf8,c,c0c3f191,c0d1b408,...) at read+0x4f syscall(f3ab8d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x281988a3, esp = 0xbfbfdaac, ebp = 0xbfbfdef8 --- Tracing command sh pid 1442 tid 100251 td 0xc5563b90 sched_switch(c5563b90,0,104,18c,4481a88d,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c5563b90,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c54c9a90,5c,c0c3f339,100,0,...) at sleepq_wait_sig+0x17 _sleep(c54c9a90,c54c9b18,15c,c0c3f339,0,...) at _sleep+0x344 kern_wait(c5563b90,ffffffff,f3ae5c74,2,0,...) at kern_wait+0xac6 wait4(c5563b90,f3ae5cf8,10,c0c3f318,c0d1b468,...) at wait4+0x3b syscall(f3ae5d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x28157f3b, esp = 0xbfbfdabc, ebp = 0xbfbfdad8 --- Tracing command sh pid 1440 tid 100204 td 0xc549f6f0 sched_switch(c549f6f0,0,104,18c,445d9f9c,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,4c,...) at mi_switch+0x200 sleepq_switch(c549f6f0,0,c0c3ca92,189,4c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4f3c780,4c,c0c3ef32,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4f3c780,c4f3c8e8,14c,c0c3ef32,0,...) at _sleep+0x344 pipe_read(c57b2348,f3a3dc54,c4541300,0,c549f6f0,...) at pipe_read+0x3f7 dofileread(f3a3dc54,ffffffff,ffffffff,0,c57b2348,...) at dofileread+0x96 kern_readv(c549f6f0,3,f3a3dc54,f3a3dc78,1,...) at kern_readv+0x58 read(c549f6f0,f3a3dcf8,c,f3a3dd38,c0d1b408,...) at read+0x4f syscall(f3a3dd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x281e08a3, esp = 0xbfbfe05c, ebp = 0xbfbfe1b8 --- Tracing command sleep pid 1433 tid 100150 td 0xc4e646f0 sched_switch(c4e646f0,0,104,18c,26528ed1,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c4e646f0,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(7531,c0896ad0,c4e646f0,3,100,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c0d86804,5c,c0c39953,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0d86804,0,15c,c0c39953,7531,...) at _sleep+0x30e kern_nanosleep(c4e646f0,f3996c64,f3996c6c,1e,0,...) at kern_nanosleep+0xc1 nanosleep(c4e646f0,f3996cf8,8,f3996d38,c0d1ca40,...) at nanosleep+0x6f syscall(f3996d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2815141f, esp = 0xbfbfee0c, ebp = 0xbfbfee48 --- Tracing command sh pid 1431 tid 100225 td 0xc549c6f0 sched_switch(c549c6f0,0,104,18c,25c87cc2,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c549c6f0,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c5498548,5c,c0c3f339,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5498548,c54985d0,15c,c0c3f339,0,...) at _sleep+0x344 kern_wait(c549c6f0,ffffffff,f3a88c74,2,0,...) at kern_wait+0xac6 wait4(c549c6f0,f3a88cf8,10,c0c3f318,c0d1b468,...) at wait4+0x3b syscall(f3a88d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x28157f3b, esp = 0xbfbfea1c, ebp = 0xbfbfea38 --- Tracing command sh pid 1427 tid 100253 td 0xc56096f0 sched_switch(c56096f0,0,104,18c,43da8fb7,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c56096f0,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c54cd7ec,5c,c0c3f339,100,0,...) at sleepq_wait_sig+0x17 _sleep(c54cd7ec,c54cd874,15c,c0c3f339,0,...) at _sleep+0x344 kern_wait(c56096f0,ffffffff,f3ae8c74,2,0,...) at kern_wait+0xac6 wait4(c56096f0,f3ae8cf8,10,c0c3f318,c0d1b468,...) at wait4+0x3b syscall(f3ae8d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x28157f3b, esp = 0xbfbfe95c, ebp = 0xbfbfe978 --- Tracing command sleep pid 1422 tid 100151 td 0xc54274a0 sched_switch(c54274a0,0,104,18c,e9eef599,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c54274a0,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(2711,c0896ad0,c54274a0,1,100,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c0d86804,5c,c0c39953,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0d86804,0,15c,c0c39953,2711,...) at _sleep+0x30e kern_nanosleep(c54274a0,f3999c64,f3999c6c,a,0,...) at kern_nanosleep+0xc1 nanosleep(c54274a0,f3999cf8,8,f3999d38,c0d1ca40,...) at nanosleep+0x6f syscall(f3999d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2815141f, esp = 0xbfbfecbc, ebp = 0xbfbfecf8 --- Tracing command csh pid 1421 tid 100188 td 0xc547f4a0 sched_switch(c547f4a0,0,104,18c,11159b87,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c547f4a0,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c4b48e04,0,c0c36ef0,c547f4a0,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4b48e70,0,f3a08b08,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4b48e70,c4b48e04,c0c40a24,4d4,0,...) at _cv_wait_sig+0x240 tty_wait(c4b48e00,c4b48e70,f3a08c54,1,0,...) at tty_wait+0x71 ttydisc_read(c4b48e00,f3a08c54,0,9e,0,...) at ttydisc_read+0x22c ttydev_read(c4f3d400,f3a08c54,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4c1fe70,f3a08c54,c5493700,0,c547f4a0,...) at devfs_read_f+0x7e dofileread(f3a08c54,ffffffff,ffffffff,0,c4c1fe70,...) at dofileread+0x96 kern_readv(c547f4a0,10,f3a08c54,f3a08c78,1,...) at kern_readv+0x58 read(c547f4a0,f3a08cf8,c,c0c1b09f,c0d1b408,...) at read+0x4f syscall(f3a08d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x282138a3, esp = 0xbfbfe6ac, ebp = 0xbfbfe6c8 --- Tracing command su pid 1406 tid 100119 td 0xc4e914a0 sched_switch(c4e914a0,0,104,18c,e8f8fac1,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c4e914a0,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4e5da90,5c,c0c3f339,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4e5da90,c4e5db18,15c,c0c3f339,0,...) at _sleep+0x344 kern_wait(c4e914a0,58d,f38ebc74,2,0,...) at kern_wait+0xac6 wait4(c4e914a0,f38ebcf8,10,f38ebd38,c0d1b468,...) at wait4+0x3b syscall(f38ebd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x28117f3b, esp = 0xbfbfe62c, ebp = 0xbfbfe648 --- Tracing command bash pid 1387 tid 100224 td 0xc549c940 sched_switch(c549c940,0,104,18c,d47f7510,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c549c940,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c4c81004,0,c0c36ef0,c549c940,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4c81070,0,f3a84b08,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4c81070,c4c81004,c0c40a24,4d4,0,...) at _cv_wait_sig+0x240 tty_wait(c4c81000,c4c81070,f3a84c54,1,0,...) at tty_wait+0x71 ttydisc_read(c4c81000,f3a84c54,0,9e,0,...) at ttydisc_read+0x22c ttydev_read(c5483000,f3a84c54,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4f44700,f3a84c54,c4f3e200,0,c549c940,...) at devfs_read_f+0x7e dofileread(f3a84c54,ffffffff,ffffffff,0,c4f44700,...) at dofileread+0x96 kern_readv(c549c940,0,f3a84c54,f3a84c78,1,...) at kern_readv+0x58 read(c549c940,f3a84cf8,c,c549c940,c0d1b408,...) at read+0x4f syscall(f3a84d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x283328a3, esp = 0xbfbfe83c, ebp = 0xbfbfe868 --- Tracing command sshd pid 1386 tid 100191 td 0xc547eb90 sched_switch(c547eb90,0,104,18c,d480b661,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c547eb90,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c51498d0,0,c0c36ef0,c547eb90,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c51498e4,0,f3a11a80,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c51498e4,c51498d0,c0c3ed5a,5c4,c4f44658,...) at _cv_wait_sig+0x240 seltdwait(c4f44658,58,c51f3100,c547eb90,c51b49e0,...) at seltdwait+0xa2 kern_select(c547eb90,a,286030b8,286030dc,0,0,66,280f87f8) at kern_select+0x4c4 select(c547eb90,f3a11cf8,14,c0c1b09f,c0d1bc78,...) at select+0x5e syscall(f3a11d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283be823, esp = 0xbfbfde5c, ebp = 0xbfbfdea8 --- Tracing command sshd pid 1345 tid 100248 td 0xc58f8250 sched_switch(c58f8250,0,104,18c,adfbbf3a,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,58,...) at mi_switch+0x200 sleepq_switch(c58f8250,0,c0c3ca92,189,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c520a6e4,58,c0c427bc,100,0,...) at sleepq_wait_sig+0x17 _sleep(c520a6e4,c520a6a4,158,c0c427bc,0) at _sleep+0x344 sbwait(c520a684,4,c0c42871,5c4,c520a6a4,...) at sbwait+0x76 soreceive_generic(c520a630,0,f3adcc54,0,0,...) at soreceive_generic+0x3f0 soreceive(c520a630,0,f3adcc54,0,0,...) at soreceive+0x38 soo_read(c4c1e5e8,f3adcc54,c5aa1e00,0,c58f8250,...) at soo_read+0x3a dofileread(f3adcc54,ffffffff,ffffffff,0,c4c1e5e8,...) at dofileread+0x96 kern_readv(c58f8250,5,f3adcc54,f3adcc78,1,...) at kern_readv+0x58 read(c58f8250,f3adccf8,c,c0c58c77,c0d1b408,...) at read+0x4f syscall(f3adcd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x283be8a3, esp = 0xbfbfde4c, ebp = 0xbfbfde88 --- Tracing command awk pid 1189 tid 100090 td 0xc4cbf940 sched_switch(c4cbf940,0,104,18c,e95bed01,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,4c,...) at mi_switch+0x200 sleepq_switch(c4cbf940,0,c0c3ca92,189,4c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c50bd600,4c,c0c3ef32,100,0,...) at sleepq_wait_sig+0x17 _sleep(c50bd600,c50bd768,14c,c0c3ef32,0,...) at _sleep+0x344 pipe_read(c4cb2af0,f3871c54,c4c40c00,0,c4cbf940,...) at pipe_read+0x3f7 dofileread(f3871c54,ffffffff,ffffffff,0,c4cb2af0,...) at dofileread+0x96 kern_readv(c4cbf940,0,f3871c54,f3871c78,1,...) at kern_readv+0x58 read(c4cbf940,f3871cf8,c,c4cbf940,c0d1b408,...) at read+0x4f syscall(f3871d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x281a78a3, esp = 0xbfbfe97c, ebp = 0xbfbfe998 --- Tracing command sh pid 1188 tid 100091 td 0xc4cbf6f0 sched_switch(c4cbf6f0,0,104,18c,e96d304a,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c4cbf6f0,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4cb87ec,5c,c0c3f339,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4cb87ec,c4cb8874,15c,c0c3f339,0,...) at _sleep+0x344 kern_wait(c4cbf6f0,ffffffff,f3875c74,2,0,...) at kern_wait+0xac6 wait4(c4cbf6f0,f3875cf8,10,c0c3f318,c0d1b468,...) at wait4+0x3b syscall(f3875d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x28157f3b, esp = 0xbfbfe95c, ebp = 0xbfbfe978 --- Tracing command top pid 1187 tid 100092 td 0xc4cbf4a0 sched_switch(c4cbf4a0,0,104,18c,1ba07219,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4cbf4a0,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(f3879a50,c0850eba,c50f9b10,0,c4cbf4a0,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c50f9b24,0,f3879a80,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c50f9b24,c50f9b10,3e9,5c4,c4f44268,...) at _cv_timedwait_sig+0x250 seltdwait(f3879c2c,f3879c34,c5421200,c4cbf4a0,323b325b,...) at seltdwait+0x8a kern_select(c4cbf4a0,2,bfbfebec,0,0,f3879c70,1,0) at kern_select+0x4c4 select(c4cbf4a0,f3879cf8,14,c0c1b09f,c0d1bc78,...) at select+0x5e syscall(f3879d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x281dc823, esp = 0xbfbfeb8c, ebp = 0xbfbfece8 --- Tracing command sh pid 1186 tid 100113 td 0xc4e924a0 sched_switch(c4e924a0,0,104,18c,bcead338,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c4e924a0,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4e8ea90,5c,c0c3f339,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4e8ea90,c4e8eb18,15c,c0c3f339,0,...) at _sleep+0x344 kern_wait(c4e924a0,ffffffff,f38d8c74,2,0,...) at kern_wait+0xac6 wait4(c4e924a0,f38d8cf8,10,f38d8d38,c0d1b468,...) at wait4+0x3b syscall(f38d8d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x28157f3b, esp = 0xbfbfeb5c, ebp = 0xbfbfeb78 --- Tracing command sshd pid 1185 tid 100146 td 0xc4e65250 sched_switch(c4e65250,0,104,18c,1ba29d0a,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4e65250,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c5107850,0,c0c36ef0,c4e65250,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c5107864,0,f3987a80,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c5107864,c5107850,c0c3ed5a,5c4,c4c1ec78,...) at _cv_wait_sig+0x240 seltdwait(c4c1ec78,58,c5263c00,c4e65250,c51b4b68,...) at seltdwait+0xa2 kern_select(c4e65250,a,286030b8,286030dc,0,0,66,280f87f8) at kern_select+0x4c4 select(c4e65250,f3987cf8,14,c0c1b09f,c0d1bc78,...) at select+0x5e syscall(f3987d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283be823, esp = 0xbfbfde5c, ebp = 0xbfbfdea8 --- Tracing command sshd pid 1184 tid 100145 td 0xc54276f0 Tracing command tail pid 1183 tid 100126 td 0xc4c1a4a0 sched_switch(c4c1a4a0,0,104,18c,2f0d505c,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,58,...) at mi_switch+0x200 sleepq_switch(c4c1a4a0,0,c0c3ca92,189,58,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c0896ad0,c4c1a4a0,0,100,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c4fc1800,58,c0c33fc3,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c4fc1800,c4fc1800,158,c0c33fc3,3e9,...) at _sleep+0x30e kern_kevent(c4c1a4a0,4,0,1,f3909c58,...) at kern_kevent+0x357 kevent(c4c1a4a0,f3909cf8,18,c0bd3a9f,c0d1d5c8,...) at kevent+0x1a2 syscall(f3909d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (363, FreeBSD ELF32, kevent), eip = 0x2815560b, esp = 0xbfbfeb6c, ebp = 0xbfbfec18 --- Tracing command sshd pid 1182 tid 100127 td 0xc4c1a250 sched_switch(c4c1a250,0,104,18c,24a01ee3,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4c1a250,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c518a8d0,0,c0c36ef0,c4c1a250,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c518a8e4,0,f390da80,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c518a8e4,c518a8d0,c0c3ed5a,5c4,c4c1f7e0,...) at _cv_wait_sig+0x240 seltdwait(c4c1f7e0,58,c5422b00,c4c1a250,c51b4c2c,...) at seltdwait+0xa2 kern_select(c4c1a250,c,286030b8,286030dc,0,0,66,280f87f8) at kern_select+0x4c4 select(c4c1a250,f390dcf8,14,c0c1b09f,c0d1bc78,...) at select+0x5e syscall(f390dd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283be823, esp = 0xbfbfde5c, ebp = 0xbfbfdea8 --- Tracing command sshd pid 1178 tid 100143 td 0xc5427940 Tracing command sshd pid 1177 tid 100099 td 0xc4bab4a0 Tracing command sshd pid 1176 tid 100134 td 0xc4e66000 Tracing command bash pid 1172 tid 100123 td 0xc4c1ab90 sched_switch(c4c1ab90,0,104,18c,aea8612f,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c4c1ab90,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4c15d34,5c,c0c3f339,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4c15d34,c4c15dbc,15c,c0c3f339,0,...) at _sleep+0x344 kern_wait(c4c1ab90,ffffffff,f38fdc74,6,0,...) at kern_wait+0xac6 wait4(c4c1ab90,f38fdcf8,10,c0c3f213,c0d1b468,...) at wait4+0x3b syscall(f38fdd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x282a9f3b, esp = 0xbfbfe9dc, ebp = 0xbfbfe9f8 --- Tracing command sshd pid 1171 tid 100096 td 0xc4babb90 sched_switch(c4babb90,0,104,18c,11171f83,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4babb90,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c5159710,0,c0c36ef0,c4babb90,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c5159724,0,f3894a80,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c5159724,c5159710,c0c3ed5a,5c4,c4c36690,...) at _cv_wait_sig+0x240 seltdwait(c4c36690,58,c4f45800,c4babb90,c51b4cf0,...) at seltdwait+0xa2 kern_select(c4babb90,a,286030b8,286030dc,0,0,66,280f87f8) at kern_select+0x4c4 select(c4babb90,f3894cf8,14,c0c1b09f,c0d1bc78,...) at select+0x5e syscall(f3894d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283be823, esp = 0xbfbfde5c, ebp = 0xbfbfdea8 --- Tracing command sshd pid 1169 tid 100098 td 0xc4bab6f0 Tracing command inetd pid 1134 tid 100137 td 0xc4e656f0 Tracing command watchdogd pid 1110 tid 100107 td 0xc4c1b6f0 sched_switch(c4c1b6f0,0,104,18c,bace4638,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c4c1b6f0,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(ea61,c0896ad0,c4c1b6f0,1,100,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c0d86804,5c,c0c39953,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0d86804,0,15c,c0c39953,ea61,...) at _sleep+0x30e kern_nanosleep(c4c1b6f0,f38c4c64,f38c4c6c,3c,0,...) at kern_nanosleep+0xc1 nanosleep(c4c1b6f0,f38c4cf8,8,f38c4d38,c0d1ca40,...) at nanosleep+0x6f syscall(f38c4d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2817b41f, esp = 0xbfbfecec, ebp = 0xbfbfed18 --- Tracing command cron pid 1101 tid 100133 td 0xc4e66250 sched_switch(c4e66250,0,104,18c,eef03852,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c4e66250,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(d2f1,c0896ad0,c4e66250,1,100,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c0d86804,5c,c0c39953,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0d86804,0,15c,c0c39953,d2f1,...) at _sleep+0x30e kern_nanosleep(c4e66250,f3942c64,f3942c6c,36,0,...) at kern_nanosleep+0xc1 nanosleep(c4e66250,f3942cf8,8,f3942d38,c0d1ca40,...) at nanosleep+0x6f syscall(f3942d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816e41f, esp = 0xbfbfec8c, ebp = 0xbfbfecb8 --- Tracing command sendmail pid 1095 tid 100078 td 0xc4bac000 sched_switch(c4bac000,0,104,18c,48c79746,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,68,...) at mi_switch+0x200 sleepq_switch(c4bac000,0,c0c3ca92,189,68,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4b1fae8,68,c0be800c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4b1fae8,c4b1fb18,168,c0be800c,0,...) at _sleep+0x344 kern_sigsuspend(c4bac000,0,0,0,0,...) at kern_sigsuspend+0xe4 sigsuspend(c4bac000,f3835cf8,4,c0c3f213,c0d1d3b8,...) at sigsuspend+0x4d syscall(f3835d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (341, FreeBSD ELF32, sigsuspend), eip = 0x283280fb, esp = 0xbfbfcf9c, ebp = 0xbfbfcfc8 --- Tracing command sendmail pid 1089 tid 100097 td 0xc4bab940 sched_switch(c4bab940,0,104,18c,f1acc114,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4bab940,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(f3897a50,c0850eba,c515a110,0,c4bab940,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c515a124,0,f3897a80,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c515a124,c515a110,1389,5c4,f3897c34,...) at _cv_timedwait_sig+0x250 seltdwait(f3897c2c,f3897c34,0,31e,c0ef2cec,...) at seltdwait+0x8a kern_select(c4bab940,0,bfbfc520,0,0,f3897c70,5,0) at kern_select+0x4c4 select(c4bab940,f3897cf8,14,c0c3f213,c0d1bc78,...) at select+0x5e syscall(f3897d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283c6823, esp = 0xbfbfc48c, ebp = 0xbfbfcfb8 --- Tracing command sshd pid 1082 tid 100105 td 0xc4c1bb90 sched_switch(c4c1bb90,0,104,18c,a4515ebd,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4c1bb90,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c5112850,0,c0c36ef0,c4c1bb90,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c5112864,0,f38bea80,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c5112864,c5112850,c0c3ed5a,5c4,c4c1f578,...) at _cv_wait_sig+0x240 seltdwait(c4c1f578,58,c4f45700,c4c1bb90,c0a908d2,...) at seltdwait+0xa2 kern_select(c4c1bb90,9,286090b0,0,0,0,c4c1bb90,f38bec98) at kern_select+0x4c4 select(c4c1bb90,f38becf8,14,f38bed38,c0d1bc78,...) at select+0x5e syscall(f38bed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283be823, esp = 0xbfbfdf1c, ebp = 0xbfbfee38 --- Tracing command ntpd pid 1045 tid 100081 td 0xc4c526f0 sched_switch(c4c526f0,0,104,18c,3b646702,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4c526f0,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c50dda90,0,c0c36ef0,c4c526f0,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c50ddaa4,0,f3841a80,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c50ddaa4,c50dda90,c0c3ed5a,5c4,c4cb2c08,...) at _cv_wait_sig+0x240 seltdwait(c4cb2c08,58,c4541300,c4c526f0,0,...) at seltdwait+0xa2 kern_select(c4c526f0,1b,bfbfed28,0,0,0,f3841c98,246) at kern_select+0x4c4 select(c4c526f0,f3841cf8,14,c4c526f0,c0d1bc78,...) at select+0x5e syscall(f3841d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x28347823, esp = 0xbfbfecfc, ebp = 0xbfbfedc8 --- Tracing command rpc.lockd pid 924 tid 100088 td 0xc4c4f4a0 sched_switch(c4c4f4a0,0,104,18c,86caf744,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4c4f4a0,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(f3869a04,c0850eba,c4bd2a00,0,c4c4f4a0,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c510a910,0,f3869a34,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c510a910,c4bd2a00,1388,3a5,c51c2800,...) at _cv_timedwait_sig+0x250 svc_run_internal(c4c4f604,14,c0c5a206,c0c599cb,f3869b8c,...) at svc_run_internal+0x356 svc_run(c4bd2a00,0,4,c0a319d0,f3869b8c,...) at svc_run+0x7f nlm_syscall(c4c4f4a0,f3869cf8,10,c0c3fb7b,c0d1c230,...) at nlm_syscall+0x6a9 syscall(f3869d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (154, FreeBSD ELF32, nlm_syscall), eip = 0x280f5d5b, esp = 0xbfbfed5c, ebp = 0xbfbfee28 --- Tracing command rpc.statd pid 918 tid 100129 td 0xc4c17b90 sched_switch(c4c17b90,0,104,18c,12632961,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4c17b90,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(f3918a50,c0850eba,c51174d0,0,c4c17b90,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c51174e4,0,f3918a80,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c51174e4,c51174d0,7531,5c4,c4c36e00,...) at _cv_timedwait_sig+0x250 seltdwait(f3918c2c,f3918c34,c4541300,c4c17b90,c0a908d2,...) at seltdwait+0x8a kern_select(c4c17b90,8,bfbfed44,0,0,f3918c70,1e,0) at kern_select+0x4c4 select(c4c17b90,f3918cf8,14,c0c3f47d,c0d1bc78,...) at select+0x5e syscall(f3918d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x2817c823, esp = 0xbfbfec9c, ebp = 0xbfbfedd8 --- Tracing command nfsd pid 909 tid 100140 td 0xc4e66940 sched_switch(c4e66940,0,104,18c,159b0e00,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4e66940,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(f3957bf8,c0850eba,c48f2e00,0,c4e66940,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c5159390,0,f3957c28,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c5159390,c48f2e00,1388,3a5,0,...) at _cv_timedwait_sig+0x250 svc_run_internal(f3957d24,c0839fe8,c48f2e00,f3957d38,c0c3425c,...) at svc_run_internal+0x356 svc_thread_start(c48f2e00,f3957d38,c0c3425c,336,c4c4e2a4,...) at svc_thread_start+0x10 fork_exit(c0a3f560,c48f2e00,f3957d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 909 tid 100139 td 0xc4e66b90 sched_switch(c4e66b90,0,104,18c,159dfac7,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4e66b90,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(f3954bf8,c0850eba,c48f2e00,0,c4e66b90,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c5108cd0,0,f3954c28,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c5108cd0,c48f2e00,1388,3e0,8bffffff,...) at _cv_timedwait_sig+0x250 svc_run_internal(f3954d24,c0839fe8,c48f2e00,f3954d38,c0c3425c,...) at svc_run_internal+0x356 svc_thread_start(c48f2e00,f3954d38,c0c3425c,336,c4c4e2a4,...) at svc_thread_start+0x10 fork_exit(c0a3f560,c48f2e00,f3954d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 909 tid 100138 td 0xc4e91000 sched_switch(c4e91000,0,104,18c,159db2b3,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4e91000,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(f3951bf8,c0850eba,c48f2e00,0,c4e91000,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c5159a50,0,f3951c28,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c5159a50,c48f2e00,1388,3a5,f,...) at _cv_timedwait_sig+0x250 svc_run_internal(f3951d24,c0839fe8,c48f2e00,f3951d38,c0c3425c,...) at svc_run_internal+0x356 svc_thread_start(c48f2e00,f3951d38,c0c3425c,336,c4c4e2a4,...) at svc_thread_start+0x10 fork_exit(c0a3f560,c48f2e00,f3951d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 909 tid 100080 td 0xc4c52940 sched_switch(c4c52940,0,104,18c,159b4017,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4c52940,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(f383dae8,c0850eba,c48f2e00,0,c4c52940,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c5159310,0,f383db18,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c5159310,c48f2e00,1388,3a5,f383db60,...) at _cv_timedwait_sig+0x250 svc_run_internal(c4c52aa4,14,c0c5a206,c0c58eb2,0,...) at svc_run_internal+0x356 svc_run(c48f2e00,0,c0c591b6,1fb,0,...) at svc_run+0x7f nfssvc_nfsd(f383dc38,c083d795,c4541300,122,f383dc50,...) at nfssvc_nfsd+0xad nfssvc_nfsserver(c4c52940,f383dcf8,4,c4c52940,c4c4e2a4,...) at nfssvc_nfsserver+0x1d5 nfssvc(c4c52940,f383dcf8,8,f383dd38,c0d1c248,...) at nfssvc+0x77 syscall(f383dd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (155, FreeBSD ELF32, nfssvc), eip = 0x280d5d3b, esp = 0xbfbfe9bc, ebp = 0xbfbfeae8 --- Tracing command nfsd pid 908 tid 100077 td 0xc4c53000 Tracing command mountd pid 906 tid 100116 td 0xc4e91b90 Tracing command rpcbind pid 824 tid 100103 td 0xc4b24940 sched_switch(c4b24940,0,104,18c,3d02d065,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b24940,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(f38a9aa8,c0850eba,c5159790,0,c4b24940,...) at sleepq_catch_signals+0xb6 sleepq_timedwait_sig(c51597a4,0,f38a9ad8,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c51597a4,c5159790,7531,5c4,f38a9b8c,...) at _cv_timedwait_sig+0x250 seltdwait(f38a9c5c,f38a9c64,4d4,c4b24940,f38a9b5c,...) at seltdwait+0x8a poll(c4b24940,f38a9cf8,c,c0c3f47d,c0d1c758,...) at poll+0x2f9 syscall(f38a9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (209, FreeBSD ELF32, poll), eip = 0x28136a3f, esp = 0xbfbfcc0c, ebp = 0xbfbfedd8 --- Tracing command syslogd pid 794 tid 100085 td 0xc4c4fb90 sched_switch(c4c4fb90,0,104,18c,1025c0e3,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4c4fb90,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c4c3c750,0,c0c36ef0,c4c4fb90,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4c3c764,0,f3855a80,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4c3c764,c4c3c750,c0c3ed5a,5c4,c4c1e348,...) at _cv_wait_sig+0x240 seltdwait(c4c1e348,58,c4541300,c4c4fb90,0,...) at seltdwait+0xa2 kern_select(c4c4fb90,9,282290ac,0,0,0,66,2819a020) at kern_select+0x4c4 select(c4c4fb90,f3855cf8,14,c0c3f328,c0d1bc78,...) at select+0x5e syscall(f3855d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x28186823, esp = 0xbfbfde7c, ebp = 0xbfbfee28 --- Tracing command devd pid 599 tid 100115 td 0xc4e92000 sched_switch(c4e92000,0,104,18c,bd169d3f,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4e92000,0,c0c3ca92,189,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0850eba,c4a6dc90,0,c0c36ef0,c4e92000,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4a6dca4,0,f38dea80,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4a6dca4,c4a6dc90,c0c3ed5a,5c4,c4d00b28,...) at _cv_wait_sig+0x240 seltdwait(c4d00b28,58,c4541300,c4e92000,c0a908d2,...) at seltdwait+0xa2 kern_select(c4e92000,6,bfbfe9b0,0,0,0,c4e92000,f38dec98) at kern_select+0x4c4 select(c4e92000,f38decf8,14,f38ded38,c0d1bc78,...) at select+0x5e syscall(f38ded38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x808800f, esp = 0xbfbfe97c, ebp = 0xbfbfee58 --- Tracing command flowcleaner pid 44 tid 100075 td 0xc4bac250 sched_switch(c4bac250,0,104,18c,abbdf32e,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4bac250,0,c0c3ca92,26a,2,...) at sleepq_switch+0x15f sleepq_timedwait(c0d86664,0,c0c475d5,2,0,...) at sleepq_timedwait+0x6b _sleep(c0d86664,0,0,c0c475d5,4e20,...) at _sleep+0x329 pause(c0c475d5,4e20,c0c4750a,41e,0,...) at pause+0x47 flowtable_cleaner(0,f163ed38,c0c3425c,336,c4b1fd34,...) at flowtable_cleaner+0x160 fork_exit(c09022f0,0,f163ed38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf163ed70, ebp = 0 --- Tracing command softdepflush pid 43 tid 100074 td 0xc4bac4a0 sched_switch(c4bac4a0,0,104,18c,4aa2c5c,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,44,...) at mi_switch+0x200 sleepq_switch(c4bac4a0,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0efe8a0,44,c0c5d09c,0,0,...) at sleepq_timedwait+0x6b _sleep(c0efe8a0,c0efe844,44,c0c5d09c,3e8,...) at _sleep+0x329 softdep_flush(0,f163bd38,c0c3425c,336,c4b38000,...) at softdep_flush+0x2b0 fork_exit(c0a6b870,0,f163bd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf163bd70, ebp = 0 --- Tracing command syncer pid 42 tid 100073 td 0xc4bac6f0 sched_switch(c4bac6f0,0,104,18c,f39a726b,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4bac6f0,0,c0c3ca92,26a,c4bac6f0,...) at sleepq_switch+0x15f sleepq_timedwait(c0ef30d4,0,f1638c88,1,0,...) at sleepq_timedwait+0x6b _cv_timedwait(c0ef30d4,c0ef30c0,3e8,6e0,4e20,...) at _cv_timedwait+0x250 sched_sync(0,f1638d38,c0c3425c,336,c4b382a4,...) at sched_sync+0x502 fork_exit(c08ecd30,0,f1638d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1638d70, ebp = 0 --- Tracing command vnlru pid 41 tid 100072 td 0xc4bac940 sched_switch(c4bac940,0,104,18c,1fea9431,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,50,...) at mi_switch+0x200 sleepq_switch(c4bac940,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c4b38548,50,c0c4674b,0,0,...) at sleepq_timedwait+0x6b _sleep(c4b38548,c0ef3094,250,c0c4674b,3e8,...) at _sleep+0x329 vnlru_proc(0,f1635d38,c0c3425c,336,c4b38548,...) at vnlru_proc+0xe7 fork_exit(c08ed8d0,0,f1635d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1635d70, ebp = 0 --- Tracing command bufdaemon pid 40 tid 100071 td 0xc4bacb90 sched_switch(c4bacb90,0,104,18c,3b7e20c5,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,44,...) at mi_switch+0x200 sleepq_switch(c4bacb90,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0ef2e08,44,c0c43eef,0,0,...) at sleepq_timedwait+0x6b _sleep(c0ef2e08,c0ef2e0c,44,c0c43eef,3e8,...) at _sleep+0x329 buf_daemon(0,f1632d38,c0c3425c,336,c4b387ec,...) at buf_daemon+0x138 fork_exit(c08d5a50,0,f1632d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1632d70, ebp = 0 --- Tracing command pagezero pid 39 tid 100070 td 0xc4b0a6f0 sched_switch(c4b0a6f0,0,104,18c,839c5473,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b0a6f0,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0eff4d4,0,c0c625db,0,0,...) at sleepq_timedwait+0x6b _sleep(c0eff4d4,c0eff090,0,c0c625db,493e0,...) at _sleep+0x329 vm_pagezero(0,f162fd38,c0c3425c,336,c4b38a90,...) at vm_pagezero+0xdc fork_exit(c0aa8330,0,f162fd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf162fd70, ebp = 0 --- Tracing command vmdaemon pid 38 tid 100069 td 0xc4b0a940 sched_switch(c4b0a940,0,104,18c,b68d3a86,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,68,...) at mi_switch+0x200 sleepq_switch(c4b0a940,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c0eff0fc,68,c0c43eef,0,0,...) at sleepq_wait+0x63 _sleep(c0eff0fc,c0eff100,68,c0c43eef,0,...) at _sleep+0x35b vm_daemon(0,f162cd38,c0c3425c,336,c4b38d34,...) at vm_daemon+0x59 fork_exit(c0aa27a0,0,f162cd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf162cd70, ebp = 0 --- Tracing command pagedaemon pid 9 tid 100068 td 0xc4b0ab90 sched_switch(c4b0ab90,0,104,18c,e023ab7d,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,44,...) at mi_switch+0x200 sleepq_switch(c4b0ab90,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0eff0c4,44,c0c43eef,0,0,...) at sleepq_timedwait+0x6b _sleep(c0eff0c4,c0eff090,44,c0c43eef,1388,...) at _sleep+0x329 vm_pageout(0,f1629d38,c0c3425c,336,c4b39000,...) at vm_pageout+0x2bb fork_exit(c0aa3650,0,f1629d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1629d70, ebp = 0 --- Tracing command usbus5 pid 37 tid 100067 td 0xc4b22000 sched_switch(c4b22000,0,104,18c,da1bc17d,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b22000,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47dcd0c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47dcd0c,c47dcdac,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15c6cf8,c079c3eb,c47dcd0c,...) at usb2_msleep+0x58 usb2_cv_wait(c47dcd0c,c47dcdac,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47dcd04,f15c6d38,c0c3425c,336,c4b392a4,...) at usb2_process+0x18b fork_exit(c079c260,c47dcd04,f15c6d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15c6d70, ebp = 0 --- Tracing command usbus5 pid 36 tid 100066 td 0xc4b22250 sched_switch(c4b22250,0,104,18c,951462af,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b22250,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47dccdc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47dccdc,c47dcdac,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15c3cf8,c079c3eb,c47dccdc,...) at usb2_msleep+0x58 usb2_cv_wait(c47dccdc,c47dcdac,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47dccd4,f15c3d38,c0c3425c,336,c4b39548,...) at usb2_process+0x18b fork_exit(c079c260,c47dccd4,f15c3d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15c3d70, ebp = 0 --- Tracing command usbus5 pid 35 tid 100065 td 0xc4b224a0 sched_switch(c4b224a0,0,104,18c,d9b55528,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b224a0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47dccac,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47dccac,c47dcdac,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15c0cf8,c079c3eb,c47dccac,...) at usb2_msleep+0x58 usb2_cv_wait(c47dccac,c47dcdac,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47dcca4,f15c0d38,c0c3425c,336,c4b1e000,...) at usb2_process+0x18b fork_exit(c079c260,c47dcca4,f15c0d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15c0d70, ebp = 0 --- Tracing command usbus5 pid 34 tid 100064 td 0xc4b226f0 sched_switch(c4b226f0,0,104,18c,d9b5454f,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b226f0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47dcc7c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47dcc7c,c47dcdac,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15bdcf8,c079c3eb,c47dcc7c,...) at usb2_msleep+0x58 usb2_cv_wait(c47dcc7c,c47dcdac,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47dcc74,f15bdd38,c0c3425c,336,c4b1e2a4,...) at usb2_process+0x18b fork_exit(c079c260,c47dcc74,f15bdd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15bdd70, ebp = 0 --- Tracing command usbus4 pid 33 tid 100063 td 0xc4b22940 sched_switch(c4b22940,0,104,18c,d9b53563,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b22940,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47d6b5c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47d6b5c,c47d6bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15bacf8,c079c3eb,c47d6b5c,...) at usb2_msleep+0x58 usb2_cv_wait(c47d6b5c,c47d6bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47d6b54,f15bad38,c0c3425c,336,c4b1e548,...) at usb2_process+0x18b fork_exit(c079c260,c47d6b54,f15bad38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15bad70, ebp = 0 --- Tracing command usbus4 pid 32 tid 100062 td 0xc4b22b90 sched_switch(c4b22b90,0,104,18c,8cb4e9d5,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b22b90,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47d6b2c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47d6b2c,c47d6bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15b7cf8,c079c3eb,c47d6b2c,...) at usb2_msleep+0x58 usb2_cv_wait(c47d6b2c,c47d6bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47d6b24,f15b7d38,c0c3425c,336,c4b1e7ec,...) at usb2_process+0x18b fork_exit(c079c260,c47d6b24,f15b7d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15b7d70, ebp = 0 --- Tracing command usbus4 pid 31 tid 100061 td 0xc4b24000 sched_switch(c4b24000,0,104,18c,d9521bfd,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b24000,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47d6afc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47d6afc,c47d6bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15b4cf8,c079c3eb,c47d6afc,...) at usb2_msleep+0x58 usb2_cv_wait(c47d6afc,c47d6bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47d6af4,f15b4d38,c0c3425c,336,c4b1ea90,...) at usb2_process+0x18b fork_exit(c079c260,c47d6af4,f15b4d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15b4d70, ebp = 0 --- Tracing command usbus4 pid 30 tid 100060 td 0xc4b24250 sched_switch(c4b24250,0,104,18c,d9520c4d,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b24250,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47d6acc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47d6acc,c47d6bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15b1cf8,c079c3eb,c47d6acc,...) at usb2_msleep+0x58 usb2_cv_wait(c47d6acc,c47d6bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47d6ac4,f15b1d38,c0c3425c,336,c4b1ed34,...) at usb2_process+0x18b fork_exit(c079c260,c47d6ac4,f15b1d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15b1d70, ebp = 0 --- Tracing command usbus3 pid 29 tid 100059 td 0xc4b244a0 sched_switch(c4b244a0,0,104,18c,d951fc04,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b244a0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47cdb5c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47cdb5c,c47cdbfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15aecf8,c079c3eb,c47cdb5c,...) at usb2_msleep+0x58 usb2_cv_wait(c47cdb5c,c47cdbfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47cdb54,f15aed38,c0c3425c,336,c4b1f000,...) at usb2_process+0x18b fork_exit(c079c260,c47cdb54,f15aed38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15aed70, ebp = 0 --- Tracing command usbus3 pid 28 tid 100058 td 0xc4b246f0 sched_switch(c4b246f0,0,104,18c,8c2b91e1,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b246f0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47cdb2c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47cdb2c,c47cdbfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15abcf8,c079c3eb,c47cdb2c,...) at usb2_msleep+0x58 usb2_cv_wait(c47cdb2c,c47cdbfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47cdb24,f15abd38,c0c3425c,336,c4b1f2a4,...) at usb2_process+0x18b fork_exit(c079c260,c47cdb24,f15abd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15abd70, ebp = 0 --- Tracing command usbus3 pid 27 tid 100057 td 0xc47f96f0 sched_switch(c47f96f0,0,104,18c,d8edc551,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c47f96f0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47cdafc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47cdafc,c47cdbfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15a8cf8,c079c3eb,c47cdafc,...) at usb2_msleep+0x58 usb2_cv_wait(c47cdafc,c47cdbfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47cdaf4,f15a8d38,c0c3425c,336,c4b1f548,...) at usb2_process+0x18b fork_exit(c079c260,c47cdaf4,f15a8d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15a8d70, ebp = 0 --- Tracing command usbus3 pid 26 tid 100056 td 0xc47f9940 sched_switch(c47f9940,0,104,18c,d8edb621,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c47f9940,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47cdacc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47cdacc,c47cdbfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15a5cf8,c079c3eb,c47cdacc,...) at usb2_msleep+0x58 usb2_cv_wait(c47cdacc,c47cdbfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47cdac4,f15a5d38,c0c3425c,336,c4b1f7ec,...) at usb2_process+0x18b fork_exit(c079c260,c47cdac4,f15a5d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15a5d70, ebp = 0 --- Tracing command usbus2 pid 25 tid 100055 td 0xc47f9b90 sched_switch(c47f9b90,0,104,18c,d8eda56d,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c47f9b90,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47c9b5c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47c9b5c,c47c9bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f15a2cf8,c079c3eb,c47c9b5c,...) at usb2_msleep+0x58 usb2_cv_wait(c47c9b5c,c47c9bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47c9b54,f15a2d38,c0c3425c,336,c46a17ec,...) at usb2_process+0x18b fork_exit(c079c260,c47c9b54,f15a2d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf15a2d70, ebp = 0 --- Tracing command usbus2 pid 24 tid 100054 td 0xc4b09000 sched_switch(c4b09000,0,104,18c,8c104d45,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b09000,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47c9b2c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47c9b2c,c47c9bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f159fcf8,c079c3eb,c47c9b2c,...) at usb2_msleep+0x58 usb2_cv_wait(c47c9b2c,c47c9bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47c9b24,f159fd38,c0c3425c,336,c46a1a90,...) at usb2_process+0x18b fork_exit(c079c260,c47c9b24,f159fd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf159fd70, ebp = 0 --- Tracing command usbus2 pid 23 tid 100053 td 0xc4b09250 sched_switch(c4b09250,0,104,18c,d88a7e43,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b09250,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47c9afc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47c9afc,c47c9bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f159ccf8,c079c3eb,c47c9afc,...) at usb2_msleep+0x58 usb2_cv_wait(c47c9afc,c47c9bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47c9af4,f159cd38,c0c3425c,336,c46a1d34,...) at usb2_process+0x18b fork_exit(c079c260,c47c9af4,f159cd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf159cd70, ebp = 0 --- Tracing command usbus2 pid 22 tid 100052 td 0xc4b094a0 sched_switch(c4b094a0,0,104,18c,d88a6ce5,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b094a0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47c9acc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47c9acc,c47c9bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f1599cf8,c079c3eb,c47c9acc,...) at usb2_msleep+0x58 usb2_cv_wait(c47c9acc,c47c9bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47c9ac4,f1599d38,c0c3425c,336,c4b0c000,...) at usb2_process+0x18b fork_exit(c079c260,c47c9ac4,f1599d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1599d70, ebp = 0 --- Tracing command usbus1 pid 21 tid 100051 td 0xc4b096f0 sched_switch(c4b096f0,0,104,18c,d88a5d21,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b096f0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47c3b5c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47c3b5c,c47c3bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f1596cf8,c079c3eb,c47c3b5c,...) at usb2_msleep+0x58 usb2_cv_wait(c47c3b5c,c47c3bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47c3b54,f1596d38,c0c3425c,336,c4b0c2a4,...) at usb2_process+0x18b fork_exit(c079c260,c47c3b54,f1596d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1596d70, ebp = 0 --- Tracing command usbus1 pid 20 tid 100050 td 0xc4b09940 sched_switch(c4b09940,0,104,18c,8bf4ade3,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b09940,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47c3b2c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47c3b2c,c47c3bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f1593cf8,c079c3eb,c47c3b2c,...) at usb2_msleep+0x58 usb2_cv_wait(c47c3b2c,c47c3bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47c3b24,f1593d38,c0c3425c,336,c4b0c548,...) at usb2_process+0x18b fork_exit(c079c260,c47c3b24,f1593d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1593d70, ebp = 0 --- Tracing command usbus1 pid 19 tid 100049 td 0xc4b09b90 sched_switch(c4b09b90,0,104,18c,d826d170,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b09b90,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47c3afc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47c3afc,c47c3bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f1590cf8,c079c3eb,c47c3afc,...) at usb2_msleep+0x58 usb2_cv_wait(c47c3afc,c47c3bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47c3af4,f1590d38,c0c3425c,336,c4b0c7ec,...) at usb2_process+0x18b fork_exit(c079c260,c47c3af4,f1590d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1590d70, ebp = 0 --- Tracing command usbus1 pid 18 tid 100048 td 0xc4b0a000 sched_switch(c4b0a000,0,104,18c,d826c14b,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b0a000,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47c3acc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47c3acc,c47c3bfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f158dcf8,c079c3eb,c47c3acc,...) at usb2_msleep+0x58 usb2_cv_wait(c47c3acc,c47c3bfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47c3ac4,f158dd38,c0c3425c,336,c4b0ca90,...) at usb2_process+0x18b fork_exit(c079c260,c47c3ac4,f158dd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf158dd70, ebp = 0 --- Tracing command usbus0 pid 17 tid 100047 td 0xc4b0a250 sched_switch(c4b0a250,0,104,18c,d826af58,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b0a250,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47beb5c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47beb5c,c47bebfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f158acf8,c079c3eb,c47beb5c,...) at usb2_msleep+0x58 usb2_cv_wait(c47beb5c,c47bebfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47beb54,f158ad38,c0c3425c,336,c4b0cd34,...) at usb2_process+0x18b fork_exit(c079c260,c47beb54,f158ad38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf158ad70, ebp = 0 --- Tracing command usbus0 pid 16 tid 100046 td 0xc4b0a4a0 sched_switch(c4b0a4a0,0,104,18c,8bd969bc,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4b0a4a0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47beb2c,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47beb2c,c47bebfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f1587cf8,c079c3eb,c47beb2c,...) at usb2_msleep+0x58 usb2_cv_wait(c47beb2c,c47bebfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47beb24,f1587d38,c0c3425c,336,c45752a4,...) at usb2_process+0x18b fork_exit(c079c260,c47beb24,f1587d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1587d70, ebp = 0 --- Tracing command usbus0 pid 15 tid 100045 td 0xc474e940 sched_switch(c474e940,0,104,18c,da25ec70,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c474e940,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47beafc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47beafc,c47bebfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f1584cf8,c079c3eb,c47beafc,...) at usb2_msleep+0x58 usb2_cv_wait(c47beafc,c47bebfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47beaf4,f1584d38,c0c3425c,336,c4575548,...) at usb2_process+0x18b fork_exit(c079c260,c47beaf4,f1584d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1584d70, ebp = 0 --- Tracing command usbus0 pid 14 tid 100044 td 0xc474eb90 sched_switch(c474eb90,0,104,18c,da25dbd0,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c474eb90,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47beacc,0,c0c27ff7,0,0,...) at sleepq_wait+0x63 _sleep(c47beacc,c47bebfc,0,c0c27ff7,0,...) at _sleep+0x35b usb2_msleep(c0c27ff7,0,f1581cf8,c079c3eb,c47beacc,...) at usb2_msleep+0x58 usb2_cv_wait(c47beacc,c47bebfc,c0c27f56,51,c0d8a780,...) at usb2_cv_wait+0x23 usb2_process(c47beac4,f1581d38,c0c3425c,336,c45757ec,...) at usb2_process+0x18b fork_exit(c079c260,c47beac4,f1581d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1581d70, ebp = 0 --- Tracing command sctp_iterator pid 8 tid 100043 td 0xc47f8000 sched_switch(c47f8000,0,104,18c,14dc3e0f,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c47f8000,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c0ef4fbc,0,c0c50669,0,0,...) at sleepq_wait+0x63 _sleep(c0ef4fbc,c0ef4ed0,0,c0c50669,0,...) at _sleep+0x35b sctp_iterator_thread(0,f157ed38,c0c3425c,336,c4575a90,...) at sctp_iterator_thread+0x60 fork_exit(c0969390,0,f157ed38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf157ed70, ebp = 0 --- Tracing command fdc0 pid 7 tid 100040 td 0xc47f86f0 sched_switch(c47f86f0,0,104,18c,34d71521,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,4c,...) at mi_switch+0x200 sleepq_switch(c47f86f0,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c47cc43c,4c,c0c2ed18,0,0,...) at sleepq_timedwait+0x6b _sleep(c47cc43c,c47cc4f0,4c,c0c2ed18,3e8,...) at _sleep+0x329 fdc_thread(c47cc400,f1572d38,c0c3425c,336,c4575d34,...) at fdc_thread+0x2be fork_exit(c0b25820,c47cc400,f1572d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1572d70, ebp = 0 --- Tracing command fw0_probe pid 6 tid 100038 td 0xc47f8b90 sched_switch(c47f8b90,0,104,18c,fe403849,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c47f8b90,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c47fd000,5c,c0c2ed18,100,0,...) at sleepq_wait_sig+0x17 _sleep(c47fd000,c4801488,15c,c0c2ed18,0,...) at _sleep+0x344 fw_bus_probe_thread(c47fd000,f1562d38,c0c3425c,336,c46a1000,...) at fw_bus_probe_thread+0xa08 fork_exit(c063d3d0,c47fd000,f1562d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1562d70, ebp = 0 --- Tracing command xpt_thrd pid 5 tid 100018 td 0xc467d6f0 sched_switch(c467d6f0,0,104,18c,da20ba44,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,4c,...) at mi_switch+0x200 sleepq_switch(c467d6f0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c0d53654,4c,c0bcf778,0,0,...) at sleepq_wait+0x63 _sleep(c0d53654,c0d5366c,4c,c0bcf778,0,...) at _sleep+0x35b xpt_scanner_thread(0,c41f6d38,c0c3425c,336,c46a12a4,...) at xpt_scanner_thread+0x41 fork_exit(c047c180,0,c41f6d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41f6d70, ebp = 0 --- Tracing command yarrow pid 13 tid 100017 td 0xc467d940 sched_switch(c467d940,0,104,18c,3d52583e,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c467d940,0,c0c3ca92,26a,2,...) at sleepq_switch+0x15f sleepq_timedwait(c0d86664,0,c0c2ed18,2,0,...) at sleepq_timedwait+0x6b _sleep(c0d86664,0,0,c0c2ed18,64,...) at _sleep+0x329 pause(c0c2ed18,64,c0c157c2,113,0,...) at pause+0x47 random_kthread(0,c41f3d38,c0c3425c,336,c46a1548,...) at random_kthread+0x1ef fork_exit(c07153d0,0,c41f3d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41f3d70, ebp = 0 --- Tracing command g_down pid 4 tid 100015 td 0xc4578250 sched_switch(c4578250,0,104,18c,42a582a8,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,4c,...) at mi_switch+0x200 sleepq_switch(c4578250,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0d843e4,4c,c0c2ed18,0,0,...) at sleepq_timedwait+0x6b _sleep(c0d843e4,c0d84348,24c,c0c2ed18,64,...) at _sleep+0x329 g_io_schedule_down(c4578250,0,c0c303e0,74,0,...) at g_io_schedule_down+0x6b g_down_procbody(0,c41edd38,c0c3425c,336,c4574000,...) at g_down_procbody+0x8d fork_exit(c0802ae0,0,c41edd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41edd70, ebp = 0 --- Tracing command g_up pid 3 tid 100014 td 0xc45784a0 sched_switch(c45784a0,0,104,18c,42b38306,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,4c,...) at mi_switch+0x200 sleepq_switch(c45784a0,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0d843e0,4c,c0c2ed18,0,0,...) at sleepq_timedwait+0x6b _sleep(c0d843e0,c0d84368,24c,c0c2ed18,64,...) at _sleep+0x329 g_io_schedule_up(c45784a0,0,c0c303e0,5d,0,...) at g_io_schedule_up+0x133 g_up_procbody(0,c41ead38,c0c3425c,336,c45742a4,...) at g_up_procbody+0x8d fork_exit(c0802b70,0,c41ead38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41ead70, ebp = 0 --- Tracing command g_event pid 2 tid 100013 td 0xc45786f0 sched_switch(c45786f0,0,104,18c,44baf7ce,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,4c,...) at mi_switch+0x200 sleepq_switch(c45786f0,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0d843d8,4c,c0c2ed18,0,0,...) at sleepq_timedwait+0x6b _sleep(c0d843d8,0,4c,c0c2ed18,64,...) at _sleep+0x329 g_event_procbody(0,c41e7d38,c0c3425c,336,c4574548,...) at g_event_procbody+0xcb fork_exit(c0802c00,0,c41e7d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41e7d70, ebp = 0 --- Tracing command intr pid 12 tid 100042 td 0xc47f8250 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100041 td 0xc47f84a0 sched_switch(c47f84a0,0,109,18c,da1be585,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c4572170,...) at mi_switch+0x200 ithread_loop(c48ea330,f1575d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c48ea330,f1575d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1575d70, ebp = 0 --- Tracing command intr pid 12 tid 100039 td 0xc47f8940 sched_switch(c47f8940,0,109,18c,e9944f45,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c47f6770,...) at mi_switch+0x200 ithread_loop(c48e0760,f1565d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c48e0760,f1565d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1565d70, ebp = 0 --- Tracing command intr pid 12 tid 100036 td 0xc47f9250 sched_switch(c47f9250,0,109,18c,d7598364,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45bb1f0,...) at mi_switch+0x200 ithread_loop(c47f7910,f1559d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c47f7910,f1559d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1559d70, ebp = 0 --- Tracing command intr pid 12 tid 100035 td 0xc47f94a0 sched_switch(c47f94a0,0,109,18c,e4d24cc1,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45bb4f0,...) at mi_switch+0x200 ithread_loop(c47f7180,f1551d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c47f7180,f1551d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1551d70, ebp = 0 --- Tracing command intr pid 12 tid 100034 td 0xc474d000 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100033 td 0xc474d250 sched_switch(c474d250,0,109,18c,4641a95,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45bb2f0,...) at mi_switch+0x200 ithread_loop(c47a4470,f153fd38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c47a4470,f153fd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf153fd70, ebp = 0 --- Tracing command intr pid 12 tid 100032 td 0xc474d4a0 sched_switch(c474d4a0,0,109,18c,3e1f589,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45bb370,...) at mi_switch+0x200 ithread_loop(c47a4640,f153bd38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c47a4640,f153bd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf153bd70, ebp = 0 --- Tracing command intr pid 12 tid 100031 td 0xc474d6f0 sched_switch(c474d6f0,0,109,18c,6b236dd3,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45bb3f0,...) at mi_switch+0x200 ithread_loop(c478e7f0,f1537d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c478e7f0,f1537d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf1537d70, ebp = 0 --- Tracing command intr pid 12 tid 100030 td 0xc474d940 sched_switch(c474d940,0,109,18c,42b2a703,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45bb0f0,...) at mi_switch+0x200 ithread_loop(c478e460,c434dd38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c478e460,c434dd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc434dd70, ebp = 0 --- Tracing command intr pid 12 tid 100029 td 0xc474db90 sched_switch(c474db90,0,109,18c,ee6e2f74,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c4777670,...) at mi_switch+0x200 ithread_loop(c4786630,c4247d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c4786630,c4247d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4247d70, ebp = 0 --- Tracing command intr pid 12 tid 100028 td 0xc474e000 sched_switch(c474e000,0,109,18c,da1cda16,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c4571c70,...) at mi_switch+0x200 ithread_loop(c474c400,c423ad38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c474c400,c423ad38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc423ad70, ebp = 0 --- Tracing command intr pid 12 tid 100023 td 0xc45bc940 sched_switch(c45bc940,0,109,18c,5ac6f202,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c474b4f0,...) at mi_switch+0x200 ithread_loop(c474a8a0,c4205d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c474a8a0,c4205d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4205d70, ebp = 0 --- Tracing command intr pid 12 tid 100022 td 0xc45bcb90 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100020 td 0xc467d250 sched_switch(c467d250,0,109,18c,2657652b,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c474b5f0,...) at mi_switch+0x200 ithread_loop(c474a8d0,c41fcd38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c474a8d0,c41fcd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41fcd70, ebp = 0 --- Tracing command intr pid 12 tid 100019 td 0xc467d4a0 sched_switch(c467d4a0,0,109,18c,1e4e242,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c474b6f0,...) at mi_switch+0x200 ithread_loop(c474a8f0,c41f9d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c474a8f0,c41f9d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41f9d70, ebp = 0 --- Tracing command intr pid 12 tid 100012 td 0xc4578940 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100011 td 0xc4578b90 sched_switch(c4578b90,0,109,18c,6ab4f4b4,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45bacf0,...) at mi_switch+0x200 ithread_loop(c45731e0,c41e1d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c45731e0,c41e1d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41e1d70, ebp = 0 --- Tracing command intr pid 12 tid 100010 td 0xc45bc000 sched_switch(c45bc000,0,109,18c,12627075,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45bad70,...) at mi_switch+0x200 ithread_loop(c45731f0,c41ded38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c45731f0,c41ded38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41ded70, ebp = 0 --- Tracing command intr pid 12 tid 100009 td 0xc45bc250 sched_switch(c45bc250,0,109,18c,3294cb42,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45badf0,...) at mi_switch+0x200 ithread_loop(c4573200,c41dbd38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c4573200,c41dbd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41dbd70, ebp = 0 --- Tracing command intr pid 12 tid 100008 td 0xc45bc4a0 sched_switch(c45bc4a0,0,109,18c,44badf7c,...) at sched_switch+0x437 mi_switch(109,0,c0c344db,4e3,c45bae70,...) at mi_switch+0x200 ithread_loop(c4573210,c41d8d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x1f6 fork_exit(c083ce10,c4573210,c41d8d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41d8d70, ebp = 0 --- Tracing command intr pid 12 tid 100007 td 0xc4576000 cpustop_handler(8,c41d5b80,c0b6ca1d,c08829e2,c0d98f70,...) at cpustop_handler+0x32 ipi_nmi_handler(c08829e2,c0d98f70,46,1,c45747ec,...) at ipi_nmi_handler+0x2f trap(c41d5b8c) at trap+0x2d calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc04e2d33, esp = 0xc41d5bcc, ebp = 0xc41d5bcc --- acpi_timer_read(c0c85720,c0d86840,c41d5c14,c086bd7d,c0c85720,...) at acpi_timer_read+0x13 acpi_timer_get_timecount_safe(c0c85720,c4576000,c41d5bf8,246,c0d86840,...) at acpi_timer_get_timecount_safe+0x18 binuptime(c41d5c88,0,c0c39a6c,176,4b3,...) at binuptime+0x3d softclock(c0d86840,c41d5cc8,c0850b24,c0d8bb00,c45baeb8,...) at softclock+0x223 intr_event_execute_handlers(c45747ec,c45bae80,c0c344db,4e9,c45baef0,...) at intr_event_execute_handlers+0x125 ithread_loop(c4573220,c41d5d38,c0c3425c,336,c45747ec,...) at ithread_loop+0x9f fork_exit(c083ce10,c4573220,c41d5d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41d5d70, ebp = 0 --- Tracing command idle pid 11 tid 100006 td 0xc4576250 sched_switch(c4576250,0,60c,187,44758d96,...) at sched_switch+0x437 mi_switch(60c,0,c0c3a374,813,0,...) at mi_switch+0x200 sched_preempt(c4576250,0,1f4,c41d1c70,c0b4fffe,...) at sched_preempt+0x9f ipi_bitmap_handler(8,28,28,c46b7c18,c46b7c00,...) at ipi_bitmap_handler+0x34 Xipi_intr_bitmap_handler() at Xipi_intr_bitmap_handler+0x2e --- interrupt, eip = 0xc0b442c5, esp = 0xc41d1c70, ebp = 0xc41d1c70 --- acpi_cpu_c1(0,ffffffff,c41d1cd8,0,c0882b01,...) at acpi_cpu_c1+0x5 acpi_cpu_idle(c41d1cb4,c0b5b23b,1,c41d1cf8,c0882dce,...) at acpi_cpu_idle+0x11c cpu_idle_acpi(1,c41d1cf8,c0882dce,1,c41d1cd8,...) at cpu_idle_acpi+0x1b cpu_idle(1,c41d1cd8,c0c3a374,a06,c4576250,...) at cpu_idle+0x1b sched_idletd(0,c41d1d38,c0c3425c,336,c4574a90,...) at sched_idletd+0x21e fork_exit(c0882bb0,0,c41d1d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41d1d70, ebp = 0 --- Tracing command idle pid 11 tid 100005 td 0xc45764a0 cpustop_handler(2,c41cec24,c0b6ca1d,c47efa00,8a,...) at cpustop_handler+0x32 ipi_nmi_handler(c47efa00,8a,c4571e80,c41cebd0,c4574a90,...) at ipi_nmi_handler+0x2f trap(c41cec30) at trap+0x2d calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc0b442c5, esp = 0xc41cec70, ebp = 0xc41cec70 --- acpi_cpu_c1(0,ffffffff,c41cecd8,1,c0882b01,...) at acpi_cpu_c1+0x5 acpi_cpu_idle(c41cecb4,c0b5b23b,0,c41cecf8,c0882dce,...) at acpi_cpu_idle+0x11c cpu_idle_acpi(0,c41cecf8,c0882dce,0,c41cecd8,...) at cpu_idle_acpi+0x1b cpu_idle(0,c41cecd8,c0c3a374,a06,c45764a0,...) at cpu_idle+0x1b sched_idletd(0,c41ced38,c0c3425c,336,c4574a90,...) at sched_idletd+0x21e fork_exit(c0882bb0,0,c41ced38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41ced70, ebp = 0 --- Tracing command idle pid 11 tid 100004 td 0xc45766f0 cpustop_handler(4,c41cbc24,c0b6ca1d,c41cbbb4,c0850b24,...) at cpustop_handler+0x32 ipi_nmi_handler(c41cbbb4,c0850b24,c0d868b0,4,c4574a90,...) at ipi_nmi_handler+0x2f trap(c41cbc30) at trap+0x2d calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc0b442c5, esp = 0xc41cbc70, ebp = 0xc41cbc70 --- acpi_cpu_c1(0,ffffffff,c41cbcd8,2,c0882b01,...) at acpi_cpu_c1+0x5 acpi_cpu_idle(c41cbcb4,c0b5b23b,0,c41cbcf8,c0882dce,...) at acpi_cpu_idle+0x11c cpu_idle_acpi(0,c41cbcf8,c0882dce,0,c41cbcd8,...) at cpu_idle_acpi+0x1b cpu_idle(0,c41cbcd8,c0c3a374,a06,c45766f0,...) at cpu_idle+0x1b sched_idletd(0,c41cbd38,c0c3425c,336,c4574a90,...) at sched_idletd+0x21e fork_exit(c0882bb0,0,c41cbd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41cbd70, ebp = 0 --- Tracing command idle pid 11 tid 100003 td 0xc4576940 sched_switch(c4576940,0,60c,187,46fc1005,...) at sched_switch+0x437 mi_switch(60c,0,c0c3a374,813,3,...) at mi_switch+0x200 sched_preempt(c4576940,3,1f4,c41c8c70,c0b4fffe,...) at sched_preempt+0x9f ipi_bitmap_handler(8,28,28,c48f6218,c48f6200,...) at ipi_bitmap_handler+0x34 Xipi_intr_bitmap_handler() at Xipi_intr_bitmap_handler+0x2e --- interrupt, eip = 0xc0b442c5, esp = 0xc41c8c70, ebp = 0xc41c8c70 --- acpi_cpu_c1(0,ffffffff,c41c8cd8,3,c0882b01,...) at acpi_cpu_c1+0x5 acpi_cpu_idle(c41c8cb4,c0b5b23b,0,c41c8cf8,c0882dce,...) at acpi_cpu_idle+0x11c cpu_idle_acpi(0,c41c8cf8,c0882dce,0,c41c8cd8,...) at cpu_idle_acpi+0x1b cpu_idle(0,c41c8cd8,c0c3a374,a06,c4576940,...) at cpu_idle+0x1b sched_idletd(0,c41c8d38,c0c3425c,336,c4574a90,...) at sched_idletd+0x21e fork_exit(c0882bb0,0,c41c8d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41c8d70, ebp = 0 --- Tracing command init pid 1 tid 100002 td 0xc4576b90 sched_switch(c4576b90,0,104,18c,200ccc3f,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,5c,...) at mi_switch+0x200 sleepq_switch(c4576b90,0,c0c3ca92,189,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0c3ca92,159,0,100,100,...) at sleepq_catch_signals+0xb6 sleepq_wait_sig(c4574d34,5c,c0c3f339,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4574d34,c4574dbc,15c,c0c3f339,0,...) at _sleep+0x344 kern_wait(c4576b90,ffffffff,c41c4c74,2,0,...) at kern_wait+0xac6 wait4(c4576b90,c41c4cf8,10,c41c4d38,c0d1b468,...) at wait4+0x3b syscall(c41c4d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x8054c7f, esp = 0xbfbfe84c, ebp = 0xbfbfe868 --- Tracing command audit pid 10 tid 100001 td 0xc4578000 sched_switch(c4578000,0,104,18c,da1e6a6d,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c4578000,0,c0c3ca92,247,c4578000,...) at sleepq_switch+0x15f sleepq_wait(c0efe240,0,c41c1c9c,1,0,...) at sleepq_wait+0x63 _cv_wait(c0efe240,c0efe224,c0c5afb2,194,0,...) at _cv_wait+0x240 audit_worker(0,c41c1d38,c0c3425c,336,c4575000,...) at audit_worker+0x84 fork_exit(c0a4ef90,0,c41c1d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41c1d70, ebp = 0 --- Tracing command kernel pid 0 tid 100037 td 0xc47f9000 sched_switch(c47f9000,0,104,18c,3c758417,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c47f9000,0,c0c3ca92,247,c47f9000,...) at sleepq_switch+0x15f sleepq_wait(c4805740,0,c0c392f0,c0c2ed18,0,...) at sleepq_wait+0x63 msleep_spin(c4805740,c480575c,c0c2ed18,0,c0c36ef0,...) at msleep_spin+0x21d taskqueue_thread_loop(c480149c,f155fd38,c0c3425c,336,c0d844a0,...) at taskqueue_thread_loop+0x8e fork_exit(c0899300,c480149c,f155fd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xf155fd70, ebp = 0 --- Tracing command kernel pid 0 tid 100027 td 0xc474e250 sched_switch(c474e250,0,104,18c,da317137,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c474e250,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c4728040,0,c0c2ed18,0,0,...) at sleepq_wait+0x63 _sleep(c4728040,c472805c,0,c0c2ed18,0,...) at _sleep+0x35b taskqueue_thread_loop(c0d56304,c4211d38,c0c3425c,336,c0d844a0,...) at taskqueue_thread_loop+0xb4 fork_exit(c0899300,c0d56304,c4211d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4211d70, ebp = 0 --- Tracing command kernel pid 0 tid 100026 td 0xc474e4a0 sched_switch(c474e4a0,0,104,18c,da315fd4,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c474e4a0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c4728040,0,c0c2ed18,0,0,...) at sleepq_wait+0x63 _sleep(c4728040,c472805c,0,c0c2ed18,0,...) at _sleep+0x35b taskqueue_thread_loop(c0d56304,c420ed38,c0c3425c,336,c0d844a0,...) at taskqueue_thread_loop+0xb4 fork_exit(c0899300,c0d56304,c420ed38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc420ed70, ebp = 0 --- Tracing command kernel pid 0 tid 100025 td 0xc474e6f0 sched_switch(c474e6f0,0,104,18c,da314bd0,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c474e6f0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c4728040,0,c0c2ed18,0,0,...) at sleepq_wait+0x63 _sleep(c4728040,c472805c,0,c0c2ed18,0,...) at _sleep+0x35b taskqueue_thread_loop(c0d56304,c420bd38,c0c3425c,336,c0d844a0,...) at taskqueue_thread_loop+0xb4 fork_exit(c0899300,c0d56304,c420bd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc420bd70, ebp = 0 --- Tracing command kernel pid 0 tid 100024 td 0xc45bc6f0 sched_switch(c45bc6f0,0,104,18c,da2b2737,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c45bc6f0,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c4728080,0,c0c2ed18,0,0,...) at sleepq_wait+0x63 _sleep(c4728080,c472809c,0,c0c2ed18,0,...) at _sleep+0x35b taskqueue_thread_loop(c0d84d64,c4208d38,c0c3425c,336,c0d844a0,...) at taskqueue_thread_loop+0xb4 fork_exit(c0899300,c0d84d64,c4208d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4208d70, ebp = 0 --- Tracing command kernel pid 0 tid 100021 td 0xc467d000 sched_switch(c467d000,0,104,18c,1e70833,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c467d000,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c47281c0,0,c0c2ed18,0,0,...) at sleepq_wait+0x63 _sleep(c47281c0,c47281dc,0,c0c2ed18,0,...) at _sleep+0x35b taskqueue_thread_loop(c0d99168,c41ffd38,c0c3425c,336,c0d844a0,...) at taskqueue_thread_loop+0xb4 fork_exit(c0899300,c0d99168,c41ffd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41ffd70, ebp = 0 --- Tracing command kernel pid 0 tid 100016 td 0xc467db90 sched_switch(c467db90,0,104,18c,7bbeddd,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,0,...) at mi_switch+0x200 sleepq_switch(c467db90,0,c0c3ca92,247,0,...) at sleepq_switch+0x15f sleepq_wait(c455cc40,0,c0c2ed18,0,0,...) at sleepq_wait+0x63 _sleep(c455cc40,c455cc5c,0,c0c2ed18,0,...) at _sleep+0x35b taskqueue_thread_loop(c0d97ca0,c41f0d38,c0c3425c,336,c0d844a0,...) at taskqueue_thread_loop+0xb4 fork_exit(c0899300,c0d97ca0,c41f0d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc41f0d70, ebp = 0 --- Tracing command kernel pid 0 tid 100000 td 0xc0d84750 sched_switch(c0d84750,0,104,18c,1efe6ea8,...) at sched_switch+0x437 mi_switch(104,0,c0c3ca92,1d2,44,...) at mi_switch+0x200 sleepq_switch(c0d84750,0,c0c3ca92,26a,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0d844a0,44,c0c3abe9,0,0,...) at sleepq_timedwait+0x6b _sleep(c0d844a0,0,44,c0c3abe9,2710,...) at _sleep+0x329 scheduler(0,141ec00,141ec00,141e000,1425000,...) at scheduler+0x23e mi_startup() at mi_startup+0x96 begin() at begin+0x2c db:1:allt> call doadump Dumping 1023 MB (2 chunks) chunk 0: 1MB (159 pages) ... ok chunk 1: 1023MB (261888 pages) 1008 992 976 960 944 928 912 896 880 864 848 832 816 800 784 768 752 736 720 704 688 672 656 640 624 608 592 576 560 544 528 512 496 480 464 448 432 416 400 384 368 352 336 320 304 288 272 256 240 224 208 192 176 160 144 128 112 96 80 64 48 32 16 ... ok Dump complete = 0xf db:1:doadump> reset (kgdb) bt #0 doadump () at pcpu.h:246 #1 0xc04be999 in db_fncall (dummy1=0xc088e8aa, dummy2=0x0, dummy3=0xffffffff, dummy4=0xf3ab8310 "$\203«ó\001") at ../../../ddb/db_command.c:548 #2 0xc04bedcf in db_command (last_cmdp=0xc0d545dc, cmd_table=0x0, dopager=0x0) at ../../../ddb/db_command.c:445 #3 0xc04bee84 in db_command_script (command=0xc0d55568 "call doadump") at ../../../ddb/db_command.c:516 #4 0xc04c2f80 in db_script_exec (scriptname=0xc0d54e40 "doadump", warnifnotfound=Variable "warnifnotfound" is not available. ) at ../../../ddb/db_script.c:302 #5 0xc04c3011 in db_run_cmd (addr=0x0, have_addr=0x0, count=0x0, modif=0xf3ab8448 "\\\204«ó") at ../../../ddb/db_script.c:375 #6 0xc04bedcf in db_command (last_cmdp=0xc0d545dc, cmd_table=0x0, dopager=0x0) at ../../../ddb/db_command.c:445 #7 0xc04bee84 in db_command_script (command=0xc0d554a0 "run pho") at ../../../ddb/db_command.c:516 #8 0xc04c2f80 in db_script_exec (scriptname=0xf3ab8554 "kdb.enter.panic", warnifnotfound=Variable "warnifnotfound" is not available. ) at ../../../ddb/db_script.c:302 #9 0xc04c3067 in db_script_kdbenter (eventname=0xc0c38742 "panic") at ../../../ddb/db_script.c:324 #10 0xc04c0d48 in db_trap (type=0x3, code=0x0) at ../../../ddb/db_main.c:228 #11 0xc088e726 in kdb_trap (type=0x3, code=0x0, tf=0xf3ab8690) at ../../../kern/subr_kdb.c:534 #12 0xc0b6cfdb in trap (frame=0xf3ab8690) at ../../../i386/i386/trap.c:685 #13 0xc0b4f90b in calltrap () at ../../../i386/i386/exception.s:165 #14 0xc088e8aa in kdb_enter (why=0xc0c38742 "panic", msg=0xc0c38742 "panic") at cpufunc.h:71 #15 0xc08608c6 in panic (fmt=0xc0c5f91d "uiomove EFAULT %jx %jx %d\n") at ../../../kern/kern_shutdown.c:559 #16 0xc0a8ecce in vm_fault_hold (map=0xc4f42658, vaddr=0x2823a000, fault_type=0x2, fault_flags=0x8, m_hold=0x0) at ../../../vm/vm_fault.c:254 #17 0xc0a90c8f in vm_fault (map=0xc4f42658, vaddr=0x2823a000, fault_type=Variable "fault_type" is not available. ) at ../../../vm/vm_fault.c:1014 #18 0xc0b6c369 in trap_pfault (frame=0xf3ab8970, usermode=0x0, eva=0x2823a000) at ../../../i386/i386/trap.c:823 #19 0xc0b6ce58 in trap (frame=0xf3ab8970) at ../../../i386/i386/trap.c:528 #20 0xc0b4f90b in calltrap () at ../../../i386/i386/exception.s:165 #21 0xc0b6a01c in slow_copyout () at ../../../i386/i386/support.s:772 #22 0x2823a000 in ?? () #23 0x00001000 in ?? () #24 0xf3ab8d2c in ?? () #25 0xc0b6c714 in syscall (frame=0xf3ab8a2c) at ../../../i386/i386/trap.c:1073 Previous frame inner to this frame (corrupt stack?) (kgdb) f 16 #16 0xc0a8ecce in vm_fault_hold (map=0xc4f42658, vaddr=0x2823a000, fault_type=0x2, fault_flags=0x8, m_hold=0x0) at ../../../vm/vm_fault.c:254 254 KASSERT(td->td_iov_base <= vaddr && (kgdb) l 249 struct thread *td; 250 int locked, error; 251 252 td = curthread; 253 if (td->td_pflags & TDP_VMUIODEADLK) { 254 KASSERT(td->td_iov_base <= vaddr && 255 vaddr < td->td_iov_base + td->td_iov_len, 256 ("uiomove EFAULT %jx %jx %d\n", (uintmax_t)vaddr, 257 (uintmax_t)td->td_iov_base, td->td_iov_len)); 258 td->td_faultaddr = vaddr; (kgdb) git diff master..HEAD diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index fee3caf..8390526 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -742,7 +742,7 @@ trap_pfault(frame, usermode) PROC_UNLOCK(p); /* Fault in the user page: */ - rv = vm_fault(map, va, ftype, + rv = vm_fault(map, eva, ftype, (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY : VM_FAULT_NORMAL); @@ -754,7 +754,7 @@ trap_pfault(frame, usermode) * Don't have to worry about process locking or stacks in the * kernel. */ - rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); + rv = vm_fault(map, eva, ftype, VM_FAULT_NORMAL); } if (rv == KERN_SUCCESS) return (0); diff --git a/sys/conf/files b/sys/conf/files index a3bd42f..3b9fca5 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1931,6 +1931,7 @@ kern/kern_poll.c optional device_polling kern/kern_priv.c standard kern/kern_proc.c standard kern/kern_prot.c standard +kern/kern_rangelock.c standard kern/kern_resource.c standard kern/kern_rmlock.c standard kern/kern_rwlock.c standard diff --git a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c index 76237fb..0d0ef86 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c +++ b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c @@ -91,7 +91,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include static int (*pru_sosend)(struct socket *so, struct sockaddr *addr, diff --git a/sys/dev/cxgb/ulp/tom/cxgb_ddp.c b/sys/dev/cxgb/ulp/tom/cxgb_ddp.c index a54598c..1c3953d 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_ddp.c +++ b/sys/dev/cxgb/ulp/tom/cxgb_ddp.c @@ -90,7 +90,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #define MAX_SCHEDULE_TIMEOUT 300 diff --git a/sys/dev/cxgb/ulp/tom/cxgb_vm.c b/sys/dev/cxgb/ulp/tom/cxgb_vm.c deleted file mode 100644 index e7a3893..0000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_vm.c +++ /dev/null @@ -1,166 +0,0 @@ -/************************************************************************** - -Copyright (c) 2007-2008, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -***************************************************************************/ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -/* - * This routine takes a user's map, array of pages, number of pages, and flags - * and then does the following: - * - validate that the user has access to those pages (flags indicates read - * or write) - if not fail - * - validate that count is enough to hold range number of pages - if not fail - * - fault in any non-resident pages - * - if the user is doing a read force a write fault for any COWed pages - * - if the user is doing a read mark all pages as dirty - * - hold all pages - */ -int -vm_fault_hold_user_pages(vm_map_t map, vm_offset_t addr, vm_page_t *mp, - int count, vm_prot_t prot) -{ - vm_offset_t end, va; - int faults, rv; - pmap_t pmap; - vm_page_t m, *pages; - - pmap = vm_map_pmap(map); - pages = mp; - addr &= ~PAGE_MASK; - /* - * Check that virtual address range is legal - * This check is somewhat bogus as on some architectures kernel - * and user do not share VA - however, it appears that all FreeBSD - * architectures define it - */ - end = addr + (count * PAGE_SIZE); - if (end > VM_MAXUSER_ADDRESS) { - log(LOG_WARNING, "bad address passed to vm_fault_hold_user_pages"); - return (EFAULT); - } - - /* - * First optimistically assume that all pages are resident - * (and R/W if for write) if so just mark pages as held (and - * dirty if for write) and return - */ - vm_page_lock_queues(); - for (pages = mp, faults = 0, va = addr; va < end; - va += PAGE_SIZE, pages++) { - /* - * page queue mutex is recursable so this is OK - * it would be really nice if we had an unlocked - * version of this so we were only acquiring the - * pmap lock 1 time as opposed to potentially - * many dozens of times - */ - *pages = m = pmap_extract_and_hold(pmap, va, prot); - if (m == NULL) { - faults++; - continue; - } - /* - * Preemptively mark dirty - the pages - * will never have the modified bit set if - * they are only changed via DMA - */ - if (prot & VM_PROT_WRITE) - vm_page_dirty(m); - - } - vm_page_unlock_queues(); - - if (faults == 0) - return (0); - - /* - * Pages either have insufficient permissions or are not present - * trigger a fault where neccessary - * - */ - rv = 0; - for (pages = mp, va = addr; va < end; va += PAGE_SIZE, pages++) { - /* - * Account for a very narrow race where the page may be - * taken away from us before it is held - */ - while (*pages == NULL) { - rv = vm_fault(map, va, prot, - (prot & VM_PROT_WRITE) ? VM_FAULT_DIRTY : VM_FAULT_NORMAL); - if (rv) - goto error; - *pages = pmap_extract_and_hold(pmap, va, prot); - } - } - return (0); -error: - log(LOG_WARNING, - "vm_fault bad return rv=%d va=0x%zx\n", rv, va); - vm_page_lock_queues(); - for (pages = mp, va = addr; va < end; va += PAGE_SIZE, pages++) - if (*pages) { - vm_page_unhold(*pages); - *pages = NULL; - } - vm_page_unlock_queues(); - return (EFAULT); -} - -void -vm_fault_unhold_pages(vm_page_t *mp, int count) -{ - - KASSERT(count >= 0, ("negative count %d", count)); - vm_page_lock_queues(); - while (count--) { - vm_page_unhold(*mp); - mp++; - } - vm_page_unlock_queues(); -} diff --git a/sys/dev/cxgb/ulp/tom/cxgb_vm.h b/sys/dev/cxgb/ulp/tom/cxgb_vm.h deleted file mode 100644 index 7532e20..0000000 --- a/sys/dev/cxgb/ulp/tom/cxgb_vm.h +++ /dev/null @@ -1,39 +0,0 @@ -/************************************************************************** - -Copyright (c) 2007-2008, Chelsio Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Neither the name of the Chelsio Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - -$FreeBSD$ - -***************************************************************************/ -#ifndef CXGB_VM_H_ -#define CXGB_VM_H_ - -int vm_fault_hold_user_pages(vm_map_t map, vm_offset_t addr, - vm_page_t *mp, int count, vm_prot_t prot); -void vm_fault_unhold_pages(vm_page_t *mp, int count); - -#endif diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c index e967104..153b7da 100644 --- a/sys/i386/i386/trap.c +++ b/sys/i386/i386/trap.c @@ -820,7 +820,7 @@ trap_pfault(frame, usermode, eva) PROC_UNLOCK(p); /* Fault in the user page: */ - rv = vm_fault(map, va, ftype, + rv = vm_fault(map, eva, ftype, (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY : VM_FAULT_NORMAL); @@ -832,7 +832,7 @@ trap_pfault(frame, usermode, eva) * Don't have to worry about process locking or stacks in the * kernel. */ - rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); + rv = vm_fault(map, eva, ftype, VM_FAULT_NORMAL); } if (rv == KERN_SUCCESS) return (0); diff --git a/sys/kern/kern_rangelock.c b/sys/kern/kern_rangelock.c new file mode 100644 index 0000000..8401ce5 --- /dev/null +++ b/sys/kern/kern_rangelock.c @@ -0,0 +1,165 @@ +/*- + * Copyright (c) 2009 Konstantin Belousov + * All rights reserved. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +uma_zone_t rl_entry_zone; + +static void +rangelock_sys_init(void) +{ + + rl_entry_zone = uma_zcreate("rl_entry", sizeof(struct rl_q_entry), + NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); +} +SYSINIT(vfs, SI_SUB_VFS, SI_ORDER_ANY, rangelock_sys_init, NULL); + +void +rangelock_init(struct rangelock *lock) +{ + + TAILQ_INIT(&lock->rl_waiters); + lock->rl_currdep = NULL; +} + +void +rangelock_destroy(struct rangelock *lock) +{ + + KASSERT(TAILQ_EMPTY(&lock->rl_waiters), ("Dangling waiters")); +} + +static int +rangelock_incompatible(const struct rl_q_entry *e1, const struct rl_q_entry *e2) +{ + + if ((e1->rl_q_flags & RL_LOCK_TYPE_MASK) == RL_LOCK_READ && + (e2->rl_q_flags & RL_LOCK_TYPE_MASK) == RL_LOCK_READ) + return (0); +#define IN_RANGE(a, e) (a <= e->rl_q_start && a < e->rl_q_end) + if (IN_RANGE(e1->rl_q_start, e2) || IN_RANGE(e2->rl_q_start, e1) || + IN_RANGE(e1->rl_q_end, e2) || IN_RANGE(e2->rl_q_end, e1)) + return (1); +#undef IN_RANGE + return (0); +} + +static void +rangelock_calc_block(struct rangelock *lock) +{ + struct rl_q_entry *entry, *entry1, *whead; + + if (lock->rl_currdep == TAILQ_FIRST(&lock->rl_waiters) && + lock->rl_currdep != NULL) + lock->rl_currdep = TAILQ_NEXT(lock->rl_currdep, rl_q_link); + for (entry = lock->rl_currdep; entry; + entry = TAILQ_NEXT(entry, rl_q_link)) { + TAILQ_FOREACH(entry1, &lock->rl_waiters, rl_q_link) { + if (rangelock_incompatible(entry, entry1)) + goto out; + if (entry1 == entry) + break; + } + } +out: + lock->rl_currdep = entry; + TAILQ_FOREACH(whead, &lock->rl_waiters, rl_q_link) { + if (whead == lock->rl_currdep) + break; + if (!(whead->rl_q_flags & RL_LOCK_GRANTED)) { + whead->rl_q_flags |= RL_LOCK_GRANTED; + wakeup(whead); + } + } +} + +static void +rangelock_unlock_vp_locked(struct vnode *vp, struct rl_q_entry *entry) +{ + + ASSERT_VI_LOCKED(vp, "rangelock"); + KASSERT(entry != vp->v_rl.rl_currdep, ("stuck currdep")); + TAILQ_REMOVE(&vp->v_rl.rl_waiters, entry, rl_q_link); + rangelock_calc_block(&vp->v_rl); + VI_UNLOCK(vp); + uma_zfree(rl_entry_zone, entry); +} + +void +rangelock_unlock(struct vnode *vp, void *cookie) +{ + struct rl_q_entry *entry; + + entry = cookie; + VI_LOCK(vp); + rangelock_unlock_vp_locked(vp, entry); +} + +void * +rangelock_unlock_range(struct vnode *vp, void *cookie, off_t base, size_t len) +{ + struct rl_q_entry *entry; + + entry = cookie; + VI_LOCK(vp); + KASSERT(entry->rl_q_flags & RL_LOCK_GRANTED, ("XXX")); + KASSERT(entry->rl_q_start == base, ("XXX")); + KASSERT(entry->rl_q_end >= base + len, ("XXX")); + if (entry->rl_q_end == base + len) { + rangelock_unlock_vp_locked(vp, cookie); + return (NULL); + } + entry->rl_q_end = base + len; + rangelock_calc_block(&vp->v_rl); + VI_UNLOCK(vp); + return (cookie); +} + +static void * +rangelock_enqueue(struct vnode *vp, struct rl_q_entry *entry) +{ + + VI_LOCK(vp); + TAILQ_INSERT_TAIL(&vp->v_rl.rl_waiters, entry, rl_q_link); + if (vp->v_rl.rl_currdep == NULL) + vp->v_rl.rl_currdep = entry; + rangelock_calc_block(&vp->v_rl); + while (!(entry->rl_q_flags & RL_LOCK_GRANTED)) + msleep(entry, &vp->v_interlock, 0, "range", 0); + VI_UNLOCK(vp); + return (entry); +} + +void * +rangelock_rlock(struct vnode *vp, off_t base, size_t len) +{ + struct rl_q_entry *entry; + + entry = uma_zalloc(rl_entry_zone, M_WAITOK); + entry->rl_q_flags = RL_LOCK_READ; + entry->rl_q_start = base; + entry->rl_q_end = base + len; + return (rangelock_enqueue(vp, entry)); +} + +void * +rangelock_wlock(struct vnode *vp, off_t base, size_t len) +{ + struct rl_q_entry *entry; + + entry = uma_zalloc(rl_entry_zone, M_WAITOK); + entry->rl_q_flags = RL_LOCK_WRITE; + entry->rl_q_start = base; + entry->rl_q_end = base + len; + return (rangelock_enqueue(vp, entry)); +} diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c index ce1afd2..e2cd1a9 100644 --- a/sys/kern/kern_subr.c +++ b/sys/kern/kern_subr.c @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #ifdef ZERO_COPY_SOCKETS #include #include @@ -138,7 +139,8 @@ uiomove(void *cp, int n, struct uio *uio) int error = 0; int save = 0; - KASSERT(uio->uio_rw == UIO_READ || uio->uio_rw == UIO_WRITE, + KASSERT(uio->uio_rw == UIO_READ || uio->uio_rw == UIO_WRITE || + uio->uio_rw == UIO_NOCOPY, ("uiomove: mode")); KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread, ("uiomove proc")); @@ -164,10 +166,25 @@ uiomove(void *cp, int n, struct uio *uio) case UIO_USERSPACE: if (ticks - PCPU_GET(switchticks) >= hogticks) uio_yield(); + if (td->td_pflags & TDP_VMUIODEADLK) { + td->td_iov_base = (uintptr_t)iov->iov_base; + td->td_iov_len = iov->iov_len; + } if (uio->uio_rw == UIO_READ) error = copyout(cp, iov->iov_base, cnt); else error = copyin(iov->iov_base, cp, cnt); + if (error == EFAULT && td->td_faultaddr != 0 && + (td->td_pflags & TDP_VMUIODEADLK)) { + KASSERT(td->td_faultaddr >= (uintptr_t)iov->iov_base && + td->td_faultaddr < (uintptr_t)iov->iov_base + cnt, + ("faultaddr %jx outside region %p %d\n", + (uintmax_t)td->td_faultaddr, + iov->iov_base, iov->iov_len)); + error = ERESTART; + fwduio(uio, td->td_faultaddr - (uintptr_t) + iov->iov_base); + } if (error) goto out; break; @@ -181,10 +198,7 @@ uiomove(void *cp, int n, struct uio *uio) case UIO_NOCOPY: break; } - iov->iov_base = (char *)iov->iov_base + cnt; - iov->iov_len -= cnt; - uio->uio_resid -= cnt; - uio->uio_offset += cnt; + fwduio(uio, cnt); cp = (char *)cp + cnt; n -= cnt; } @@ -544,6 +558,7 @@ copyinuio(struct iovec *iovp, u_int iovcnt, struct uio **uiop) uio->uio_segflg = UIO_USERSPACE; uio->uio_offset = -1; uio->uio_resid = 0; + uio->uio_flags = 0; for (i = 0; i < iovcnt; i++) { if (iov->iov_len > INT_MAX - uio->uio_resid) { free(uio, M_IOV); @@ -569,3 +584,25 @@ cloneuio(struct uio *uiop) bcopy(uiop->uio_iov, uio->uio_iov, iovlen); return (uio); } + +void +fwduio(struct uio *uio, int cnt) +{ + + uio->uio_iov->iov_base = (char *)uio->uio_iov->iov_base + cnt; + uio->uio_iov->iov_len -= cnt; + uio->uio_resid -= cnt; + uio->uio_offset += cnt; +} + +void +copyuio(struct uio *dst, struct uio *src) +{ + struct iovec *dst_iovec; + + dst_iovec = dst->uio_iov; + *dst = *src; + dst->uio_iov = dst_iovec; + bcopy(src->uio_iov, dst->uio_iov, src->uio_iovcnt * + sizeof(struct iovec)); +} diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index fb6b35d..1b59cc5 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -768,6 +768,8 @@ pipe_build_write_buffer(wpipe, uio) * should not be performed outside of this loop. */ race: + KASSERT(!(curthread->td_pflags & TDP_VMUIODEADLK), + ("pipe_build_write_buffer: TDP_VMUIODEADLK")); if (vm_fault_quick((caddr_t)addr, VM_PROT_READ) < 0) { vm_page_lock_queues(); for (j = 0; j < i; j++) diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 0ed7ce4..1742fb5 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -211,11 +211,14 @@ proc_sstep(struct thread *td) int proc_rwmem(struct proc *p, struct uio *uio) { + struct vmspace *vm; vm_map_t map; - vm_object_t backing_object, object = NULL; - vm_offset_t pageno = 0; /* page number */ + vm_page_t m; + struct thread *td; + vm_offset_t pageno, uva; vm_prot_t reqprot; - int error, fault_flags, writing; + int error, fault_flags, page_offset, writing, save_vmuiodeadlk; + u_int len; /* * Assert that someone has locked this vmspace. (Should be @@ -228,30 +231,21 @@ proc_rwmem(struct proc *p, struct uio *uio) /* * The map we want... */ - map = &p->p_vmspace->vm_map; + vm = vmspace_acquire_ref(p); + map = &vm->vm_map; + td = curthread; writing = uio->uio_rw == UIO_WRITE; reqprot = writing ? (VM_PROT_WRITE | VM_PROT_OVERRIDE_WRITE) : VM_PROT_READ; fault_flags = writing ? VM_FAULT_DIRTY : VM_FAULT_NORMAL; + save_vmuiodeadlk = td->td_pflags & TDP_VMUIODEADLK; /* * Only map in one page at a time. We don't have to, but it * makes things easier. This way is trivial - right? */ do { - vm_map_t tmap; - vm_offset_t uva; - int page_offset; /* offset into page */ - vm_map_entry_t out_entry; - vm_prot_t out_prot; - boolean_t wired; - vm_pindex_t pindex; - u_int len; - vm_page_t m; - - object = NULL; - uva = (vm_offset_t)uio->uio_offset; /* @@ -268,57 +262,15 @@ proc_rwmem(struct proc *p, struct uio *uio) /* * Fault the page on behalf of the process */ - error = vm_fault(map, pageno, reqprot, fault_flags); - if (error) { + td->td_pflags &= ~TDP_VMUIODEADLK; + error = vm_fault_hold(map, pageno, reqprot, fault_flags, &m); + td->td_pflags |= save_vmuiodeadlk; + if (error) { error = EFAULT; break; } /* - * Now we need to get the page. out_entry, out_prot, wired, - * and single_use aren't used. One would think the vm code - * would be a *bit* nicer... We use tmap because - * vm_map_lookup() can change the map argument. - */ - tmap = map; - error = vm_map_lookup(&tmap, pageno, reqprot, &out_entry, - &object, &pindex, &out_prot, &wired); - if (error) { - error = EFAULT; - break; - } - VM_OBJECT_LOCK(object); - while ((m = vm_page_lookup(object, pindex)) == NULL && - !writing && - (backing_object = object->backing_object) != NULL) { - /* - * Allow fallback to backing objects if we are reading. - */ - VM_OBJECT_LOCK(backing_object); - pindex += OFF_TO_IDX(object->backing_object_offset); - VM_OBJECT_UNLOCK(object); - object = backing_object; - } - VM_OBJECT_UNLOCK(object); - if (m == NULL) { - vm_map_lookup_done(tmap, out_entry); - error = EFAULT; - break; - } - - /* - * Hold the page in memory. - */ - vm_page_lock_queues(); - vm_page_hold(m); - vm_page_unlock_queues(); - - /* - * We're done with tmap now. - */ - vm_map_lookup_done(tmap, out_entry); - - /* * Now do the i/o move. */ error = uiomove_fromphys(&m, page_offset, len, uio); @@ -331,6 +283,7 @@ proc_rwmem(struct proc *p, struct uio *uio) vm_page_unlock_queues(); } while (error == 0 && uio->uio_resid > 0); + vmspace_free(vm); return (error); } diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index a3c3e97..60333bf 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -3885,6 +3885,8 @@ vmapbuf(struct buf *bp) * to work for the kernland address space (see: sparc64 port). */ retry: + KASSERT(!(curthread->td_pflags & TDP_VMUIODEADLK), + ("vmapbuf: TDP_VMUIODEADLK")); if (vm_fault_quick(addr >= bp->b_data ? addr : bp->b_data, prot) < 0) { vm_page_lock_queues(); diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 8c26b13..e3867d6 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -871,6 +871,7 @@ vdestroy(struct vnode *vp) /* XXX Elsewhere we can detect an already freed vnode via NULL v_op. */ vp->v_op = NULL; #endif + rangelock_destroy(&vp->v_rl); lockdestroy(vp->v_vnlock); mtx_destroy(&vp->v_interlock); mtx_destroy(BO_MTX(bo)); @@ -1025,6 +1026,7 @@ alloc: if ((mp->mnt_kern_flag & MNTK_NOKNOTE) != 0) vp->v_vflag |= VV_NOKNOTE; } + rangelock_init(&vp->v_rl); *vpp = vp; return (0); diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 3cc6f22..21fead6 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -60,8 +60,12 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include +#include +#include + #include static fo_rdwr_t vn_read; @@ -363,37 +367,64 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, active_cred, file_cred, int *aresid; struct thread *td; { - struct uio auio; - struct iovec aiov; + struct uio auio, auio_clone; + struct iovec aiov, aiov_clone; struct mount *mp; struct ucred *cred; - int error; + vm_page_t *m_hold; + void *rl_cookie; + int wired_pages, error; VFS_ASSERT_GIANT(vp->v_mount); + auio.uio_iov = &aiov; + auio.uio_iovcnt = 1; + aiov.iov_base = base; + aiov.iov_len = len; + auio.uio_resid = len; + auio.uio_offset = offset; + auio.uio_segflg = segflg; + auio.uio_rw = rw; + auio.uio_td = td; + error = 0; + + if ((ioflg & IO_NODELOCKED) == 0) { + if (rw == UIO_READ) + rl_cookie = rangelock_rlock(vp, offset, len); + else + rl_cookie = rangelock_wlock(vp, offset, len); + } else + rl_cookie = NULL; + + m_hold = NULL; + if (segflg == UIO_USERSPACE) { + m_hold = malloc(sizeof(vm_page_t) * (btoc(len) + 1), M_IOV, + M_WAITOK); + aiov_clone = aiov; + auio_clone = auio; + auio_clone.uio_iov = &aiov_clone; + error = vm_wireuio(&auio, m_hold, + round_page((vm_offset_t)base + len) - + trunc_page((vm_offset_t)base), &wired_pages); + if (error) { + free(m_hold, M_IOV); + goto out; + } + } + if ((ioflg & IO_NODELOCKED) == 0) { mp = NULL; if (rw == UIO_WRITE) { if (vp->v_type != VCHR && (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) - return (error); + goto out_unwire; vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); } else vn_lock(vp, LK_SHARED | LK_RETRY); } ASSERT_VOP_LOCKED(vp, "IO_NODELOCKED with no vp lock held"); - auio.uio_iov = &aiov; - auio.uio_iovcnt = 1; - aiov.iov_base = base; - aiov.iov_len = len; - auio.uio_resid = len; - auio.uio_offset = offset; - auio.uio_segflg = segflg; - auio.uio_rw = rw; - auio.uio_td = td; - error = 0; #ifdef MAC if ((ioflg & IO_NOMACCHECK) == 0) { if (rw == UIO_READ) @@ -424,6 +455,14 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, active_cred, file_cred, vn_finished_write(mp); VOP_UNLOCK(vp, 0); } +out_unwire: + if (segflg == UIO_USERSPACE) { + vm_unwireuio(&auio_clone, m_hold, wired_pages); + free(m_hold, M_IOV); + } +out: + if (rl_cookie != NULL) + rangelock_unlock(vp, rl_cookie); return (error); } @@ -485,68 +524,214 @@ vn_rdwr_inchunks(rw, vp, base, len, offset, segflg, ioflg, active_cred, return (error); } +static int uio_hold_pages = 12; +SYSCTL_INT(_vfs, OID_AUTO, uio_hold_pages, CTLFLAG_RW, &uio_hold_pages, 0, + "The max amount of held pages for one i/o chunk"); +static int uio_short = 128; +SYSCTL_INT(_vfs, OID_AUTO, uio_short, CTLFLAG_RW, &uio_short, 0, + "The length of the short i/o"); + +typedef int (*vn_chunk_func_t)(struct file *, struct uio *, struct ucred *, + int, int, struct thread *); + +static int +do_vn_rw_chunked(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, int ioflag, struct thread *td, vm_page_t *m_hold, + vn_chunk_func_t vn_chunk_func) +{ + struct uio *uio_clone; + int error, wire_bytes, io_chunk, total_cnt, cnt; + int first_chunk, wired_pages; + + if (uio->uio_segflg != UIO_USERSPACE || fp->f_vnode->v_type != VREG) + return (vn_chunk_func(fp, uio, active_cred, flags, ioflag, td)); + + uio_clone = cloneuio(uio); + KASSERT(!(td->td_pflags & TDP_VMUIODEADLK), + ("Nested TDP_VMUIODEADLK")); + td->td_pflags |= TDP_VMUIODEADLK; + td->td_faultaddr = 0; + error = vn_chunk_func(fp, uio, active_cred, flags, ioflag, td); + td->td_pflags &= ~TDP_VMUIODEADLK; + if (error != ERESTART || td->td_faultaddr == 0) + goto out; + + first_chunk = 1; + if (uio->uio_flags & UIO_ROLLBACK) { + cnt = uio_clone->uio_resid - uio->uio_resid; + copyuio(uio, uio_clone); + if (cnt > 0) { + uio->uio_rw = UIO_NOCOPY; + uiomove(NULL, cnt, uio); + uio->uio_rw = uio_clone->uio_rw; + first_chunk = 0; + } + } + while (uio->uio_resid > 0) { + io_chunk = min(uio_hold_pages * PAGE_SIZE, uio->uio_resid); /* XXXKIB */ + wire_bytes = round_page(io_chunk); + error = vm_wireuio(uio, m_hold, wire_bytes, &wired_pages); + if (error != 0) { + if (!first_chunk) + error = 0; + break; + } + copyuio(uio_clone, uio); + total_cnt = uio->uio_resid; + uio->uio_resid = io_chunk; + error = vn_chunk_func(fp, uio, active_cred, flags, ioflag, td); + vm_unwireuio(uio_clone, m_hold, wired_pages); + cnt = io_chunk - uio->uio_resid; + uio->uio_resid = total_cnt - cnt; + if (error != 0) { + if (!first_chunk) + error = 0; + break; + } + if (cnt == 0) + break; + first_chunk = 0; + } + out: + free(uio_clone, M_IOV); + return (error); +} + +static struct mtx * +vn_lock_foffset(struct file *fp) +{ + struct mtx *mtxp; + + mtxp = mtx_pool_find(mtxpool_sleep, fp); + mtx_lock(mtxp); + while (fp->f_vnread_flags & FOFFSET_LOCKED) { + fp->f_vnread_flags |= FOFFSET_LOCK_WAITING; + msleep(&fp->f_vnread_flags, mtxp, PUSER -1, + "vnread offlock", 0); + } + fp->f_vnread_flags |= FOFFSET_LOCKED; + mtx_unlock(mtxp); + return (mtxp); +} + +static void +vn_unlock_foffset(struct file *fp, struct mtx *mtxp) +{ + + mtx_lock(mtxp); + if (fp->f_vnread_flags & FOFFSET_LOCK_WAITING) + wakeup(&fp->f_vnread_flags); + fp->f_vnread_flags = 0; + mtx_unlock(mtxp); +} + +static inline int +vn_read_wired_chunk(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, int ioflag, struct thread *td) +{ + struct vnode *vp; + int error, vfslocked; + + vp = fp->f_vnode; + + vfslocked = VFS_LOCK_GIANT(vp->v_mount); + vn_lock(vp, LK_SHARED | LK_RETRY); + + ioflag |= sequential_heuristic(uio, fp); + +#ifdef MAC + error = mac_vnode_check_read(active_cred, fp->f_cred, vp); + if (error == 0) +#endif + error = VOP_READ(vp, uio, ioflag, fp->f_cred); + fp->f_nextoff = uio->uio_offset; + VOP_UNLOCK(vp, 0); + VFS_UNLOCK_GIANT(vfslocked); + return (error); +} + /* * File table vnode read routine. */ static int -vn_read(fp, uio, active_cred, flags, td) - struct file *fp; - struct uio *uio; - struct ucred *active_cred; - struct thread *td; - int flags; +vn_read(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, + struct thread *td) { struct vnode *vp; - int error, ioflag; + vm_page_t m_hold[uio_hold_pages]; struct mtx *mtxp; - int vfslocked; + void *rl_cookie; + int ioflag; + int error; KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", uio->uio_td, td)); - mtxp = NULL; - vp = fp->f_vnode; ioflag = 0; if (fp->f_flag & FNONBLOCK) ioflag |= IO_NDELAY; if (fp->f_flag & O_DIRECT) ioflag |= IO_DIRECT; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); + vp = fp->f_vnode; + /* * According to McKusick the vn lock was protecting f_offset here. * It is now protected by the FOFFSET_LOCKED flag. */ if ((flags & FOF_OFFSET) == 0) { - mtxp = mtx_pool_find(mtxpool_sleep, fp); - mtx_lock(mtxp); - while(fp->f_vnread_flags & FOFFSET_LOCKED) { - fp->f_vnread_flags |= FOFFSET_LOCK_WAITING; - msleep(&fp->f_vnread_flags, mtxp, PUSER -1, - "vnread offlock", 0); - } - fp->f_vnread_flags |= FOFFSET_LOCKED; - mtx_unlock(mtxp); - vn_lock(vp, LK_SHARED | LK_RETRY); + mtxp = vn_lock_foffset(fp); uio->uio_offset = fp->f_offset; } else - vn_lock(vp, LK_SHARED | LK_RETRY); + mtxp = NULL; /* gcc */ + if (vp->v_type == VREG) + rl_cookie = rangelock_rlock(vp, uio->uio_offset, + uio->uio_resid); + else + rl_cookie = NULL; + error = do_vn_rw_chunked(fp, uio, active_cred, flags, ioflag, td, + m_hold, vn_read_wired_chunk); + if (rl_cookie != NULL) + rangelock_unlock(vp, rl_cookie); + if ((flags & FOF_OFFSET) == 0) { + fp->f_offset = uio->uio_offset; + vn_unlock_foffset(fp, mtxp); + } + return (error); +} - ioflag |= sequential_heuristic(uio, fp); +static inline int +vn_write_wired_chunk(struct file *fp, struct uio *uio, + struct ucred *active_cred, int flags, int ioflag, struct thread *td) +{ + struct mount *mp; + struct vnode *vp; + int error, vfslocked; + mp = NULL; + vp = fp->f_vnode; + vfslocked = VFS_LOCK_GIANT(vp->v_mount); + if (vp->v_type == VREG) + bwillwrite(); + if (vp->v_type != VCHR) { + error = vn_start_write(vp, &mp, V_WAIT | PCATCH); + if (error != 0) + goto unlock; + } + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + if ((flags & FOF_OFFSET) == 0) + uio->uio_offset = fp->f_offset; + ioflag |= sequential_heuristic(uio, fp); #ifdef MAC - error = mac_vnode_check_read(active_cred, fp->f_cred, vp); + error = mac_vnode_check_write(active_cred, fp->f_cred, vp); if (error == 0) #endif - error = VOP_READ(vp, uio, ioflag, fp->f_cred); - if ((flags & FOF_OFFSET) == 0) { + error = VOP_WRITE(vp, uio, ioflag, fp->f_cred); + if ((flags & FOF_OFFSET) == 0) fp->f_offset = uio->uio_offset; - mtx_lock(mtxp); - if (fp->f_vnread_flags & FOFFSET_LOCK_WAITING) - wakeup(&fp->f_vnread_flags); - fp->f_vnread_flags = 0; - mtx_unlock(mtxp); - } fp->f_nextoff = uio->uio_offset; VOP_UNLOCK(vp, 0); + if (vp->v_type != VCHR) + vn_finished_write(mp); +unlock: VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -555,24 +740,17 @@ vn_read(fp, uio, active_cred, flags, td) * File table vnode write routine. */ static int -vn_write(fp, uio, active_cred, flags, td) - struct file *fp; - struct uio *uio; - struct ucred *active_cred; - struct thread *td; - int flags; +vn_write(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, + struct thread *td) { struct vnode *vp; - struct mount *mp; - int error, ioflag; - int vfslocked; + vm_page_t m_hold[uio_hold_pages]; + void *rl_cookie; + int ioflag, error; KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", uio->uio_td, td)); vp = fp->f_vnode; - vfslocked = VFS_LOCK_GIANT(vp->v_mount); - if (vp->v_type == VREG) - bwillwrite(); ioflag = IO_UNIT; if (vp->v_type == VREG && (fp->f_flag & O_APPEND)) ioflag |= IO_APPEND; @@ -583,27 +761,22 @@ vn_write(fp, uio, active_cred, flags, td) if ((fp->f_flag & O_FSYNC) || (vp->v_mount && (vp->v_mount->mnt_flag & MNT_SYNCHRONOUS))) ioflag |= IO_SYNC; - mp = NULL; - if (vp->v_type != VCHR && - (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) - goto unlock; - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); - if ((flags & FOF_OFFSET) == 0) - uio->uio_offset = fp->f_offset; - ioflag |= sequential_heuristic(uio, fp); -#ifdef MAC - error = mac_vnode_check_write(active_cred, fp->f_cred, vp); - if (error == 0) -#endif - error = VOP_WRITE(vp, uio, ioflag, fp->f_cred); - if ((flags & FOF_OFFSET) == 0) - fp->f_offset = uio->uio_offset; - fp->f_nextoff = uio->uio_offset; - VOP_UNLOCK(vp, 0); - if (vp->v_type != VCHR) - vn_finished_write(mp); -unlock: - VFS_UNLOCK_GIANT(vfslocked); + if (vp->v_type == VREG) { + if ((ioflag & IO_APPEND) || !(flags & FOF_OFFSET)) + /* + * For appenders, punt and lock the whole + * range. It also protects f_offset. + */ + rl_cookie = rangelock_wlock(vp, 0, (size_t)-1); + else + rl_cookie = rangelock_wlock(vp, uio->uio_offset, + uio->uio_resid); + } else + rl_cookie = NULL; + error = do_vn_rw_chunked(fp, uio, active_cred, flags, ioflag, td, + m_hold, vn_write_wired_chunk); + if (rl_cookie != NULL) + rangelock_unlock(vp, rl_cookie); return (error); } diff --git a/sys/modules/cxgb/tom/Makefile b/sys/modules/cxgb/tom/Makefile index 2b8750a..d2566fd 100644 --- a/sys/modules/cxgb/tom/Makefile +++ b/sys/modules/cxgb/tom/Makefile @@ -5,7 +5,7 @@ CXGB = ${.CURDIR}/../../../dev/cxgb KMOD= tom SRCS= cxgb_tom.c cxgb_cpl_io.c cxgb_listen.c cxgb_tom_sysctl.c cxgb_cpl_socket.c -SRCS+= cxgb_ddp.c cxgb_vm.c cxgb_l2t.c cxgb_tcp_offload.c +SRCS+= cxgb_ddp.c cxgb_l2t.c cxgb_tcp_offload.c SRCS+= opt_compat.h opt_inet.h opt_inet6.h opt_ipsec.h opt_mac.h SRCS+= opt_tcpdebug.h opt_ddb.h opt_sched.h opt_global.h opt_ktr.h SRCS+= device_if.h bus_if.h pci_if.h diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 96f811d..9ce96da 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -236,6 +236,9 @@ struct thread { struct file *td_fpop; /* (k) file referencing cdev under op */ int td_dbgflags; /* (c) Userland debugger flags */ struct osd td_osd; /* (k) Object specific data. */ + vm_offset_t td_faultaddr; /* (k) fault address for TDP_VMUIODEADLK */ + vm_offset_t td_iov_base; /* (k) the region where VMUIODEADLK ... */ + size_t td_iov_len; /* (k) ... is handled */ #define td_endzero td_base_pri /* Copied during fork1() or thread_sched_upcall(). */ @@ -353,7 +356,7 @@ do { \ #define TDP_COWINPROGRESS 0x00000010 /* Snapshot copy-on-write in progress. */ #define TDP_ALTSTACK 0x00000020 /* Have alternate signal stack. */ #define TDP_DEADLKTREAT 0x00000040 /* Lock aquisition - deadlock treatment. */ -#define TDP_UNUSED80 0x00000080 /* available. */ +#define TDP_VMUIODEADLK 0x00000080 /* Non-blocking vm_fault required. */ #define TDP_NOSLEEPING 0x00000100 /* Thread is not allowed to sleep on a sq. */ #define TDP_OWEUPC 0x00000200 /* Call addupc() at next AST. */ #define TDP_ITHREAD 0x00000400 /* Thread is an interrupt thread. */ diff --git a/sys/sys/rangelock.h b/sys/sys/rangelock.h new file mode 100644 index 0000000..5ec6433 --- /dev/null +++ b/sys/sys/rangelock.h @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 2009 Konstantin Belousov + * All rights reserved. + * + * $FreeBSD$ + */ + +#ifndef _SYS_RANGELOCK_H +#define _SYS_RANGELOCK_H + +#include +#include +#include +#include +#include + +#ifdef _KERNEL + +struct vnode; + +struct rl_q_entry +{ + TAILQ_ENTRY(rl_q_entry) rl_q_link; + size_t rl_q_start, rl_q_end; + int rl_q_flags; +}; + +#define RL_LOCK_READ 0x0001 +#define RL_LOCK_WRITE 0x0002 +#define RL_LOCK_TYPE_MASK 0x0003 +#define RL_LOCK_GRANTED 0x0004 + +struct rangelock +{ + TAILQ_HEAD(, rl_q_entry) rl_waiters; + struct rl_q_entry *rl_currdep; +}; + +void rangelock_init(struct rangelock *lock); +void rangelock_destroy(struct rangelock *lock); +void rangelock_unlock(struct vnode *vp, void *cookie); +void *rangelock_unlock_range(struct vnode *vp, void *cookie, off_t base, + size_t len); +void *rangelock_rlock(struct vnode *vp, off_t base, size_t len); +void *rangelock_wlock(struct vnode *vp, off_t base, size_t len); +#endif + +#endif diff --git a/sys/sys/uio.h b/sys/sys/uio.h index 871f93a..6a7cce7 100644 --- a/sys/sys/uio.h +++ b/sys/sys/uio.h @@ -68,8 +68,11 @@ struct uio { enum uio_seg uio_segflg; /* address space */ enum uio_rw uio_rw; /* operation */ struct thread *uio_td; /* owner */ + int uio_flags; }; +#define UIO_ROLLBACK 0x0001 + /* * Limits * @@ -100,6 +103,8 @@ int uiomove_frombuf(void *buf, int buflen, struct uio *uio); int uiomove_fromphys(struct vm_page *ma[], vm_offset_t offset, int n, struct uio *uio); int uiomoveco(void *cp, int n, struct uio *uio, int disposable); +void fwduio(struct uio *uip, int cnt); +void copyuio(struct uio *dst, struct uio *src); #else /* !_KERNEL */ diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 0a3d1dc..af760a5 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -168,7 +169,8 @@ struct vnode { */ struct vpollinfo *v_pollinfo; /* G Poll events, p for *v_pi */ struct label *v_label; /* MAC label for vnode */ - struct lockf *v_lockf; /* Byte-level lock list */ + struct lockf *v_lockf; /* Byte-level adv lock list */ + struct rangelock v_rl; /* Byte-range lock */ }; #endif /* defined(_KERNEL) || defined(_KVM_VNODE) */ diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 1abb994..0f38815 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -632,8 +632,8 @@ ffs_write(ap) struct buf *bp; struct thread *td; ufs_lbn_t lbn; - off_t osize; - int seqcount; + off_t osize, s_size; + int seqcount, s_resid; int blkoffset, error, flags, ioflag, resid, size, xfersize; vp = ap->a_vp; @@ -707,6 +707,7 @@ ffs_write(ap) lbn = lblkno(fs, uio->uio_offset); blkoffset = blkoff(fs, uio->uio_offset); xfersize = fs->fs_bsize - blkoffset; + s_size = ip->i_size; if (uio->uio_resid < xfersize) xfersize = uio->uio_resid; if (uio->uio_offset + xfersize > ip->i_size) @@ -734,8 +735,10 @@ ffs_write(ap) * the prior contents of the pages exposed to a userland * mmap(). XXX deal with uiomove() errors a better way. */ - if ((bp->b_flags & B_CACHE) == 0 && fs->fs_bsize <= xfersize) + if ((bp->b_flags & B_CACHE) == 0 /*&& fs->fs_bsize <= xfersize*/) { vfs_bio_clrbuf(bp); + flags |= BA_CLRBUF; + } if (ioflag & IO_DIRECT) bp->b_flags |= B_DIRECT; if ((ioflag & (IO_SYNC|IO_INVAL)) == (IO_SYNC|IO_INVAL)) @@ -750,6 +753,7 @@ ffs_write(ap) if (size < xfersize) xfersize = size; + s_resid = uio->uio_resid; error = uiomove((char *)bp->b_data + blkoffset, (int)xfersize, uio); if ((ioflag & (IO_VMIO|IO_DIRECT)) && @@ -757,6 +761,42 @@ ffs_write(ap) bp->b_flags |= B_RELBUF; } + if (error == ERESTART && !(flags & BA_CLRBUF) && + !(bp->b_flags & B_CACHE)) { + /* + * When uiomove() failed due to vm_fault + * cowardly refused to process a dangerous + * page-in, and the previous content of the + * buffer is garbage, e.g. because supposed + * transfer length was big enough to cover the + * whole buffer, discard it. + */ + if (LIST_EMPTY(&bp->b_dep)) { + bp->b_flags |= B_RELBUF | B_NOCACHE | B_INVAL; + brelse(bp); + } else { + /* + * But cannot discard the buffer with + * dependencies. Since the buffer is + * newly allocated, fill it with + * zeros. If the buffer extended the + * file, truncate. + */ + vfs_bio_clrbuf(bp); + if (ioflag & IO_SYNC) + bwrite(bp); + else + bawrite(bp); + ffs_truncate(vp, s_size, + IO_NORMAL | (ioflag & IO_SYNC), ap->a_cred, + uio->uio_td); + } + uio->uio_offset -= s_resid - uio->uio_resid; + uio->uio_resid = s_resid; + uio->uio_flags |= UIO_ROLLBACK; + break; + } + /* * If IO_SYNC each buffer is written synchronously. Otherwise * if we have a severe page deficiency write the buffer @@ -808,6 +848,8 @@ ffs_write(ap) ap->a_cred, uio->uio_td); uio->uio_offset -= resid - uio->uio_resid; uio->uio_resid = resid; + if (error == ERESTART) + uio->uio_flags |= UIO_ROLLBACK; } } else if (resid > uio->uio_resid && (ioflag & IO_SYNC)) error = ffs_update(vp, 1); diff --git a/sys/vm/vm_extern.h b/sys/vm/vm_extern.h index 475a20e..b0e982d 100644 --- a/sys/vm/vm_extern.h +++ b/sys/vm/vm_extern.h @@ -34,11 +34,13 @@ #define _VM_EXTERN_H_ struct buf; +struct iovec; struct proc; struct vmspace; struct vmtotal; struct mount; struct vnode; +struct uio; #ifdef _KERNEL @@ -55,7 +57,12 @@ vm_map_t kmem_suballoc(vm_map_t, vm_offset_t *, vm_offset_t *, vm_size_t, void swapout_procs(int); int useracc(void *, int, int); int vm_fault(vm_map_t, vm_offset_t, vm_prot_t, int); +int vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, + int fault_flags, struct vm_page **m_hold); void vm_fault_copy_entry(vm_map_t, vm_map_t, vm_map_entry_t, vm_map_entry_t); +int vm_fault_hold_user_pages(vm_map_t map, vm_offset_t addr, + vm_page_t *mp, int count, vm_prot_t prot); +void vm_fault_unhold_pages(vm_page_t *mp, int count); void vm_fault_unwire(vm_map_t, vm_offset_t, vm_offset_t, boolean_t); int vm_fault_wire(vm_map_t, vm_offset_t, vm_offset_t, boolean_t, boolean_t); int vm_forkproc(struct thread *, struct proc *, struct thread *, struct vmspace *, int); @@ -84,5 +91,9 @@ int vm_thread_new(struct thread *td, int pages); int vm_thread_new_altkstack(struct thread *td, int pages); void vm_thread_swapin(struct thread *td); void vm_thread_swapout(struct thread *td); +int vm_wireuio(struct uio *uiop, struct vm_page *m_hold[], int wire_bytes, + int *wired_pages); +void vm_unwireuio(struct uio *, struct vm_page *m_hold[], int wired_pages); + #endif /* _KERNEL */ #endif /* !_VM_EXTERN_H_ */ diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 3a21616..6b1158a 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -1,4 +1,30 @@ /*- + +Copyright (c) 2007-2008, Chelsio Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Neither the name of the Chelsio Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. * Copyright (c) 1994 John S. Dyson @@ -207,8 +233,8 @@ unlock_and_deallocate(struct faultstate *fs) * Caller may hold no locks. */ int -vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, - int fault_flags) +vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, + int fault_flags, struct vm_page **m_hold) { vm_prot_t prot; int is_first_object_locked, result; @@ -220,8 +246,20 @@ vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, int faultcount, ahead, behind; struct faultstate fs; struct vnode *vp; + struct thread *td; int locked, error; + td = curthread; + if (td->td_pflags & TDP_VMUIODEADLK) { + KASSERT(td->td_iov_base <= vaddr && + vaddr < td->td_iov_base + td->td_iov_len, + ("uiomove EFAULT %jx %jx %d\n", (uintmax_t)vaddr, + (uintmax_t)td->td_iov_base, td->td_iov_len)); + td->td_faultaddr = vaddr; + return (KERN_VMUIODEADLOCK); + } + vaddr = trunc_page(vaddr); + hardfault = 0; growstack = TRUE; PCPU_INC(cnt.v_vm_faults); @@ -949,6 +987,10 @@ vnode_locked: } else { vm_page_activate(fs.m); } + if (m_hold != NULL) { + *m_hold = fs.m; + vm_page_hold(fs.m); + } vm_page_unlock_queues(); vm_page_wakeup(fs.m); @@ -964,6 +1006,14 @@ vnode_locked: return (KERN_SUCCESS); } +int +vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, + int fault_flags) +{ + + return (vm_fault_hold(map, vaddr, fault_type, fault_flags, NULL)); +} + /* * vm_fault_prefault provides a quick way of clustering * pagefaults into a processes address space. It is a "cousin" @@ -1360,3 +1410,108 @@ vm_fault_additional_pages(m, rbehind, rahead, marray, reqpage) /* return number of pages */ return i; } + +/* + * This routine takes a user's map, array of pages, number of pages, and flags + * and then does the following: + * - validate that the user has access to those pages (flags indicates read + * or write) - if not fail + * - validate that count is enough to hold range number of pages - if not fail + * - fault in any non-resident pages + * - if the user is doing a read force a write fault for any COWed pages + * - if the user is doing a read mark all pages as dirty + * - hold all pages + */ +int +vm_fault_hold_user_pages(vm_map_t map, vm_offset_t addr, vm_page_t *mp, + int count, vm_prot_t prot) +{ + vm_offset_t end, va; + int faults, rv; + pmap_t pmap; + vm_page_t m, *pages; + + pmap = vm_map_pmap(map); + pages = mp; + addr &= ~PAGE_MASK; + + /* + * Check that virtual address range is legal. + * This check is somewhat bogus as on some architectures kernel + * and user do not share VA - however, it appears that all FreeBSD + * architectures define it + */ + end = addr + (count * PAGE_SIZE); + if (end > VM_MAXUSER_ADDRESS) + return (EFAULT); + + /* + * First optimistically assume that all pages are resident + * (and R/W if for write) if so just mark pages as held (and + * dirty if for write) and return. + */ + vm_page_lock_queues(); + for (pages = mp, faults = 0, va = addr; va < end; + va += PAGE_SIZE, pages++) { + /* + * Page queue mutex is recursable so this is OK. + * It would be really nice if we had an unlocked + * version of this so we were only acquiring the + * pmap lock 1 time as opposed to potentially + * many dozens of times. + */ + *pages = m = pmap_extract_and_hold(pmap, va, prot); + if (m == NULL) { + faults++; + continue; + } + + /* + * Preemptively mark dirty - the pages will never have + * the modified bit set if they are only changed via + * DMA. + */ + if (prot & VM_PROT_WRITE) + vm_page_dirty(m); + } + vm_page_unlock_queues(); + + if (faults == 0) + return (0); + + /* + * Pages either have insufficient permissions or are not present + * trigger a fault where neccessary. + */ + rv = 0; + for (pages = mp, va = addr; va < end; va += PAGE_SIZE, pages++) { + rv = vm_fault_hold(map, va, prot, (prot & VM_PROT_WRITE) ? + VM_FAULT_DIRTY : VM_FAULT_NORMAL, pages); + if (rv) + goto error; + } + return (0); + +error: + vm_page_lock_queues(); + for (pages = mp, va = addr; va < end; va += PAGE_SIZE, pages++) + if (*pages) { + vm_page_unhold(*pages); + *pages = NULL; + } + vm_page_unlock_queues(); + return (EFAULT); +} + +void +vm_fault_unhold_pages(vm_page_t *mp, int count) +{ + + KASSERT(count >= 0, ("negative count %d", count)); + vm_page_lock_queues(); + while (count--) { + vm_page_unhold(*mp); + mp++; + } + vm_page_unlock_queues(); +} diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c index 96fe61b..20dd38f 100644 --- a/sys/vm/vm_kern.c +++ b/sys/vm/vm_kern.c @@ -356,7 +356,7 @@ retry: vm_page_unlock_queues(); } VM_OBJECT_UNLOCK(kmem_object); - vm_map_delete(map, addr, addr + size); + vm_map_delete(map, addr, addr + size, FALSE); vm_map_unlock(map); return (0); } @@ -380,11 +380,6 @@ retry: panic("kmem_malloc: entry not found or misaligned"); entry->wired_count = 1; - /* - * At this point, the kmem_object must be unlocked because - * vm_map_simplify_entry() calls vm_object_deallocate(), which - * locks the kmem_object. - */ vm_map_simplify_entry(map, entry); /* @@ -458,7 +453,8 @@ kmem_free_wakeup(map, addr, size) { vm_map_lock(map); - (void) vm_map_delete(map, trunc_page(addr), round_page(addr + size)); + (void) vm_map_delete(map, trunc_page(addr), round_page(addr + size), + FALSE); if (map->needs_wakeup) { map->needs_wakeup = FALSE; vm_map_wakeup(map); diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 32fdfde..3f19a49 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -454,26 +454,50 @@ _vm_map_lock(vm_map_t map, const char *file, int line) } void -_vm_map_unlock(vm_map_t map, const char *file, int line) +_vm_map_unlock(vm_map_t map, boolean_t process_freelist, const char *file, + int line) { vm_map_entry_t free_entry, entry; vm_object_t object; + struct vnode *vp; + struct mount *mp; - free_entry = map->deferred_freelist; - map->deferred_freelist = NULL; + free_entry = NULL; /* to please gcc */ + if (process_freelist) { + free_entry = map->deferred_freelist; + map->deferred_freelist = NULL; + } if (map->system_map) _mtx_unlock_flags(&map->system_mtx, 0, file, line); else _sx_xunlock(&map->lock, file, line); + if (!process_freelist) + return; + while (free_entry != NULL) { entry = free_entry; free_entry = free_entry->next; + KASSERT((entry->eflags & MAP_ENTRY_LINKED) == 0 && + (entry->eflags & MAP_ENTRY_UNLINKED) != 0 && + (entry->eflags & MAP_ENTRY_ON_FREELIST) != 0, + ("vm_map_unlock: eflags %p", entry)); + if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) { object = entry->object.vm_object; + mp = NULL; + if (entry->eflags & MAP_ENTRY_VN_WRITECNT) { + vp = object->handle; + vn_start_write(vp, &mp, V_WAIT); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + vp->v_writecount--; + VOP_UNLOCK(vp, 0); + } vm_object_deallocate(object); + if (mp != NULL) + vn_finished_write(mp); } vm_map_entry_dispose(map, entry); @@ -630,7 +654,7 @@ vm_map_unlock_and_wait(vm_map_t map, int timo) { mtx_lock(&map_sleep_mtx); - vm_map_unlock(map); + _vm_map_unlock(map, FALSE, LOCK_FILE, LOCK_LINE); return (msleep(&map->root, &map_sleep_mtx, PDROP | PVM, "vmmaps", timo)); } @@ -692,6 +716,9 @@ _vm_map_init(vm_map_t map, vm_offset_t min, vm_offset_t max) { map->header.next = map->header.prev = &map->header; +#ifdef INVARIANTS + map->header.eflags = MAP_ENTRY_LINKED; +#endif map->needs_wakeup = FALSE; map->system_map = 0; map->min_offset = min; @@ -742,6 +769,135 @@ vm_map_entry_create(vm_map_t map) } /* + * vm_map_entry_inc_vn_wcnt: [ internal use only ] + * + * Increments v_writecount for the vnode that backs writeable + * mapping by the entry. To satisfy lock order between map lock + * and vnode lock, map lock might be dropped. In this case, the + * entry is marked as in transition to prevent entry removal. + + * The increment is postponed for the map entry that is in + * transition, when the transition was not set by the caller. In + * this case, MAP_ENTRY_VN_WRITECNT flag is transfered to + * MAP_ENTRY_DEFER_WRITECNT, and the owner of the transition + * state should call this function before lifting the + * MAP_ENTRY_IN_TRANSITION flag. + * + * When called from vm_map_clip_start of vm_map_entry_clip_end + * and going to drop the map lock, protect both the entry and the + * second part of the clipped region, that is passed in the + * neighbour parameter. + */ +static void +vm_map_entry_inc_vn_wcnt(vm_map_t map, vm_map_entry_t entry, + vm_map_entry_t neighbour, boolean_t transition_owner) +{ + struct vnode *vp; + vm_offset_t start, end, n_start, n_end; + boolean_t clear_transition, need_wakeup; + int last_timestamp; + + VM_MAP_ASSERT_LOCKED(map); + KASSERT((entry->eflags & MAP_ENTRY_LINKED) != 0 && + (entry->eflags & MAP_ENTRY_UNLINKED) == 0 && + (entry->eflags & MAP_ENTRY_ON_FREELIST) == 0, + ("vm_map_entry_inc_vn_wcnt: eflags1 %p", entry)); + KASSERT(neighbour == NULL || entry->eflags == neighbour->eflags, + ("vm_map_entry_inc_vn_wcnt: wrong neighbour")); + + if ((entry->eflags & (MAP_ENTRY_VN_WRITECNT | + MAP_ENTRY_DEFER_WRITECNT)) == 0) + return; + KASSERT((entry->eflags & MAP_ENTRY_VN_WRITECNT) == 0 || + (entry->eflags & MAP_ENTRY_DEFER_WRITECNT) == 0, + ("vm_map_entry_inc_vn_wcnt: both %p", entry)); + KASSERT(!transition_owner || + (entry->eflags & MAP_ENTRY_IN_TRANSITION) != 0, + ("transition_owner but no transition %p", entry)); + if (!transition_owner && + (entry->eflags & MAP_ENTRY_IN_TRANSITION) != 0) { + if ((entry->eflags & MAP_ENTRY_VN_WRITECNT) != 0) { + entry->eflags &= ~MAP_ENTRY_VN_WRITECNT; + entry->eflags |= MAP_ENTRY_DEFER_WRITECNT; + } + return; + } + if ((entry->eflags & MAP_ENTRY_IN_TRANSITION) != 0) { + KASSERT(transition_owner, ("not transition owner %p", entry)); + clear_transition = FALSE; + } else { + clear_transition = TRUE; + entry->eflags |= MAP_ENTRY_IN_TRANSITION; + if (neighbour != NULL) + neighbour->eflags |= MAP_ENTRY_IN_TRANSITION; + } + start = entry->start; + end = entry->end; + if (neighbour != NULL) { + n_start = neighbour->start; + n_end = neighbour->end; + } else + n_start = n_end = 0; + vp = entry->object.vm_object->handle; + vhold(vp); + if (vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT) == 0) + goto incr; + last_timestamp = map->timestamp; + vm_map_unlock(map); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + vm_map_lock(map); + if (last_timestamp + 1 != map->timestamp) { + if (!vm_map_lookup_entry(map, start, &entry)) + panic("vm_map_entry_inc_vn_wcnt: lost entry"); + if (clear_transition && neighbour != NULL && + !vm_map_lookup_entry(map, n_start, &neighbour)) + panic("vm_map_entry_inc_vn_wcnt: lost neighbour entry"); + } +incr: + for (need_wakeup = FALSE; entry != &map->header && entry->start < end; + entry = entry->next) { + /* + * Only clipping is allowed for an entry marked as in + * transition. Make a single pass to increment + * v_writecount for all clip splinters and fix their + * flags accordingly. + */ + KASSERT(entry->object.vm_object != NULL && + entry->object.vm_object->type == OBJT_VNODE && + entry->object.vm_object->handle == (void *)vp, + ("vm_map_entry_inc_vn_wcnt: not a clip")); + KASSERT((entry->eflags & MAP_ENTRY_LINKED) != 0 && + (entry->eflags & MAP_ENTRY_UNLINKED) == 0 && + (entry->eflags & MAP_ENTRY_ON_FREELIST) == 0, + ("vm_map_entry_inc_vn_wcnt: eflags2 %p", entry)); + vp->v_writecount += 1; + entry->eflags &= ~MAP_ENTRY_DEFER_WRITECNT; + entry->eflags |= MAP_ENTRY_VN_WRITECNT; + if (clear_transition) { + if (entry->eflags & MAP_ENTRY_NEEDS_WAKEUP) { + entry->eflags &= ~MAP_ENTRY_NEEDS_WAKEUP; + need_wakeup = TRUE; + } + entry->eflags &= ~MAP_ENTRY_IN_TRANSITION; + } + } + VOP_UNLOCK(vp, 0); + vdrop(vp); + if (clear_transition && neighbour != NULL) { + for (; neighbour != &map->header && neighbour->start < n_end; + neighbour = neighbour->next) { + if (neighbour->eflags & MAP_ENTRY_NEEDS_WAKEUP) { + neighbour->eflags &= ~MAP_ENTRY_NEEDS_WAKEUP; + need_wakeup = TRUE; + } + neighbour->eflags &= ~MAP_ENTRY_IN_TRANSITION; + } + } + if (need_wakeup) + vm_map_wakeup(map); +} + +/* * vm_map_entry_set_behavior: * * Set the expected access behavior, either normal, random, or @@ -919,6 +1075,9 @@ vm_map_entry_link(vm_map_t map, entry->next->start) - entry->end; vm_map_entry_set_max_free(entry); map->root = entry; +#ifdef INVARIANTS + entry->eflags |= MAP_ENTRY_LINKED; +#endif } static void @@ -928,6 +1087,11 @@ vm_map_entry_unlink(vm_map_t map, vm_map_entry_t next, prev, root; VM_MAP_ASSERT_LOCKED(map); + KASSERT((entry->eflags & MAP_ENTRY_LINKED) != 0 && + (entry->eflags & MAP_ENTRY_UNLINKED) == 0 && + (entry->eflags & MAP_ENTRY_ON_FREELIST) == 0, + ("vm_map_entry_unlink: eflags %p", entry)); + if (entry != map->root) vm_map_entry_splay(entry->start, map->root); if (entry->left == NULL) @@ -948,6 +1112,10 @@ vm_map_entry_unlink(vm_map_t map, map->nentries--; CTR3(KTR_VM, "vm_map_entry_unlink: map %p, nentries %d, entry %p", map, map->nentries, entry); +#ifdef INVARIANTS + entry->eflags &= ~MAP_ENTRY_LINKED; + entry->eflags |= MAP_ENTRY_UNLINKED; +#endif } /* @@ -1005,6 +1173,10 @@ vm_map_lookup_entry( *entry = &map->header; else if (address >= cur->start && cur->end > address) { *entry = cur; + KASSERT(((*entry)->eflags & MAP_ENTRY_LINKED) != 0 && + ((*entry)->eflags & MAP_ENTRY_UNLINKED) == 0 && + ((*entry)->eflags & MAP_ENTRY_ON_FREELIST) == 0, + ("vm_map_lookup_entry: eflags %p", *entry)); return (TRUE); } else if ((locked = vm_map_locked(map)) || sx_try_upgrade(&map->lock)) { @@ -1025,6 +1197,10 @@ vm_map_lookup_entry( */ if (address >= cur->start) { *entry = cur; + KASSERT(((*entry)->eflags & MAP_ENTRY_LINKED) != 0 && + ((*entry)->eflags & MAP_ENTRY_UNLINKED) == 0 && + ((*entry)->eflags & MAP_ENTRY_ON_FREELIST) == 0, + ("vm_map_lookup_entry: eflags %p", *entry)); if (cur->end > address) return (TRUE); } else @@ -1043,6 +1219,10 @@ vm_map_lookup_entry( cur = cur->left; } else if (cur->end > address) { *entry = cur; + KASSERT(((*entry)->eflags & MAP_ENTRY_LINKED) != 0 && + ((*entry)->eflags & MAP_ENTRY_UNLINKED) == 0 && + ((*entry)->eflags & MAP_ENTRY_ON_FREELIST) == 0, + ("vm_map_lookup_entry: eflags %p", *entry)); return (TRUE); } else { if (cur->right == NULL) { @@ -1052,6 +1232,10 @@ vm_map_lookup_entry( cur = cur->right; } } + KASSERT(((*entry)->eflags & MAP_ENTRY_LINKED) != 0 && + ((*entry)->eflags & MAP_ENTRY_UNLINKED) == 0 && + ((*entry)->eflags & MAP_ENTRY_ON_FREELIST) == 0, + ("vm_map_lookup_entry: eflags %p", *entry)); return (FALSE); } @@ -1076,6 +1260,7 @@ vm_map_insert(vm_map_t map, vm_object_t object, vm_ooffset_t offset, vm_map_entry_t prev_entry; vm_map_entry_t temp_entry; vm_eflags_t protoeflags; + struct vnode *vp; VM_MAP_ASSERT_LOCKED(map); @@ -1189,12 +1374,21 @@ vm_map_insert(vm_map_t map, vm_object_t object, vm_ooffset_t offset, new_entry->protection = prot; new_entry->max_protection = max; new_entry->wired_count = 0; + new_entry->pin_count = 0; /* * Insert the new entry into the list */ vm_map_entry_link(map, prev_entry, new_entry); map->size += new_entry->end - new_entry->start; + if (object != NULL && object->type == OBJT_VNODE && + (new_entry->max_protection & VM_PROT_WRITE) != 0 && + (cow & MAP_COPY_ON_WRITE) == 0) { + vp = object->handle; + ASSERT_VOP_ELOCKED(vp, "vm_map_insert inc v_writecount"); + vp->v_writecount++; + new_entry->eflags |= MAP_ENTRY_VN_WRITECNT; + } #if 0 /* @@ -1321,7 +1515,7 @@ vm_map_fixed(vm_map_t map, vm_object_t object, vm_ooffset_t offset, end = start + length; vm_map_lock(map); VM_MAP_RANGE_CHECK(map, start, end); - (void) vm_map_delete(map, start, end); + (void) vm_map_delete(map, start, end, TRUE); result = vm_map_insert(map, object, offset, start, end, prot, max, cow); vm_map_unlock(map); @@ -1384,6 +1578,11 @@ vm_map_simplify_entry(vm_map_t map, vm_map_entry_t entry) vm_map_entry_t next, prev; vm_size_t prevsize, esize; + KASSERT((entry->eflags & MAP_ENTRY_LINKED) != 0 && + (entry->eflags & MAP_ENTRY_UNLINKED) == 0 && + (entry->eflags & MAP_ENTRY_ON_FREELIST) == 0, + ("vm_map_simplify_entry: eflags %p", entry)); + if (entry->eflags & (MAP_ENTRY_IN_TRANSITION | MAP_ENTRY_IS_SUB_MAP)) return; @@ -1398,25 +1597,19 @@ vm_map_simplify_entry(vm_map_t map, vm_map_entry_t entry) (prev->protection == entry->protection) && (prev->max_protection == entry->max_protection) && (prev->inheritance == entry->inheritance) && - (prev->wired_count == entry->wired_count)) { + (prev->wired_count == entry->wired_count) && + (prev->pin_count == entry->pin_count)) { vm_map_entry_unlink(map, prev); entry->start = prev->start; entry->offset = prev->offset; if (entry->prev != &map->header) vm_map_entry_resize_free(map, entry->prev); - /* - * If the backing object is a vnode object, - * vm_object_deallocate() calls vrele(). - * However, vrele() does not lock the vnode - * because the vnode has additional - * references. Thus, the map lock can be kept - * without causing a lock-order reversal with - * the vnode lock. - */ - if (prev->object.vm_object) - vm_object_deallocate(prev->object.vm_object); - vm_map_entry_dispose(map, prev); + prev->next = map->deferred_freelist; + map->deferred_freelist = prev; +#ifdef INVARIANTS + prev->eflags |= MAP_ENTRY_ON_FREELIST; +#endif } } @@ -1431,17 +1624,17 @@ vm_map_simplify_entry(vm_map_t map, vm_map_entry_t entry) (next->protection == entry->protection) && (next->max_protection == entry->max_protection) && (next->inheritance == entry->inheritance) && - (next->wired_count == entry->wired_count)) { + (next->wired_count == entry->wired_count) && + (next->pin_count == entry->pin_count)) { vm_map_entry_unlink(map, next); entry->end = next->end; vm_map_entry_resize_free(map, entry); - /* - * See comment above. - */ - if (next->object.vm_object) - vm_object_deallocate(next->object.vm_object); - vm_map_entry_dispose(map, next); + next->next = map->deferred_freelist; + map->deferred_freelist = next; +#ifdef INVARIANTS + next->eflags |= MAP_ENTRY_ON_FREELIST; +#endif } } } @@ -1452,10 +1645,10 @@ vm_map_simplify_entry(vm_map_t map, vm_map_entry_t entry) * the specified address; if necessary, * it splits the entry into two. */ -#define vm_map_clip_start(map, entry, startaddr) \ +#define vm_map_clip_start(map, entry, startaddr) \ { \ - if (startaddr > entry->start) \ - _vm_map_clip_start(map, entry, startaddr); \ + if (startaddr > (*entry)->start) \ + _vm_map_clip_start(map, entry, startaddr); \ } /* @@ -1463,10 +1656,14 @@ vm_map_simplify_entry(vm_map_t map, vm_map_entry_t entry) * the entry must be split. */ static void -_vm_map_clip_start(vm_map_t map, vm_map_entry_t entry, vm_offset_t start) +_vm_map_clip_start(vm_map_t map, vm_map_entry_t *pentry, vm_offset_t start) { - vm_map_entry_t new_entry; + vm_map_entry_t entry, new_entry; + int last_timestamp; + entry = *pentry; + KASSERT((entry->eflags & MAP_ENTRY_IS_HOLDER) == 0, + ("Holder %p in vm_map_clip_start", entry)); VM_MAP_ASSERT_LOCKED(map); /* @@ -1486,7 +1683,7 @@ _vm_map_clip_start(vm_map_t map, vm_map_entry_t entry, vm_offset_t start) if (entry->object.vm_object == NULL && !map->system_map) { vm_object_t object; object = vm_object_allocate(OBJT_DEFAULT, - atop(entry->end - entry->start)); + atop(entry->end - entry->start)); entry->object.vm_object = object; entry->offset = 0; } @@ -1502,6 +1699,13 @@ _vm_map_clip_start(vm_map_t map, vm_map_entry_t entry, vm_offset_t start) if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) { vm_object_reference(new_entry->object.vm_object); + last_timestamp = map->timestamp; + vm_map_entry_inc_vn_wcnt(map, new_entry, entry, FALSE); + if (last_timestamp != map->timestamp && + last_timestamp + 1 != map->timestamp) { + if (!vm_map_lookup_entry(map, start, pentry)) + panic("vm_map_clip_start: lost entry"); + } } } @@ -1514,7 +1718,7 @@ _vm_map_clip_start(vm_map_t map, vm_map_entry_t entry, vm_offset_t start) */ #define vm_map_clip_end(map, entry, endaddr) \ { \ - if ((endaddr) < (entry->end)) \ + if ((endaddr) < ((*entry)->end)) \ _vm_map_clip_end((map), (entry), (endaddr)); \ } @@ -1523,9 +1727,20 @@ _vm_map_clip_start(vm_map_t map, vm_map_entry_t entry, vm_offset_t start) * the entry must be split. */ static void -_vm_map_clip_end(vm_map_t map, vm_map_entry_t entry, vm_offset_t end) +_vm_map_clip_end(vm_map_t map, vm_map_entry_t *pentry, vm_offset_t end) { - vm_map_entry_t new_entry; + vm_map_entry_t entry, new_entry; + int last_timestamp; + vm_offset_t entry_start; + + entry = *pentry; + KASSERT((entry->eflags & MAP_ENTRY_IS_HOLDER) == 0, + ("Holder %p in vm_map_clip_end", entry)); + KASSERT((entry->eflags & MAP_ENTRY_LINKED) != 0 && + (entry->eflags & MAP_ENTRY_UNLINKED) == 0 && + (entry->eflags & MAP_ENTRY_ON_FREELIST) == 0, + ("vm_map_clip_end: eflags %p", entry)); + VM_MAP_ASSERT_LOCKED(map); @@ -1557,6 +1772,14 @@ _vm_map_clip_end(vm_map_t map, vm_map_entry_t entry, vm_offset_t end) if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) { vm_object_reference(new_entry->object.vm_object); + entry_start = entry->start; + last_timestamp = map->timestamp; + vm_map_entry_inc_vn_wcnt(map, new_entry, entry, FALSE); + if (last_timestamp != map->timestamp && + last_timestamp + 1 != map->timestamp) { + if (!vm_map_lookup_entry(map, entry_start, pentry)) + panic("vm_map_clip_end: lost entry"); + } } } @@ -1593,11 +1816,11 @@ vm_map_submap( VM_MAP_RANGE_CHECK(map, start, end); if (vm_map_lookup_entry(map, start, &entry)) { - vm_map_clip_start(map, entry, start); + vm_map_clip_start(map, &entry, start); } else entry = entry->next; - vm_map_clip_end(map, entry, end); + vm_map_clip_end(map, &entry, end); if ((entry->start == start) && (entry->end == end) && ((entry->eflags & MAP_ENTRY_COW) == 0) && @@ -1732,7 +1955,10 @@ vm_map_protect(vm_map_t map, vm_offset_t start, vm_offset_t end, VM_MAP_RANGE_CHECK(map, start, end); if (vm_map_lookup_entry(map, start, &entry)) { - vm_map_clip_start(map, entry, start); + if (entry->eflags & MAP_ENTRY_IS_HOLDER) + entry = entry->next; + else + vm_map_clip_start(map, &entry, start); } else { entry = entry->next; } @@ -1746,7 +1972,8 @@ vm_map_protect(vm_map_t map, vm_offset_t start, vm_offset_t end, vm_map_unlock(map); return (KERN_INVALID_ARGUMENT); } - if ((new_prot & current->max_protection) != new_prot) { + if (!(current->eflags & MAP_ENTRY_IS_HOLDER) && + (new_prot & current->max_protection) != new_prot) { vm_map_unlock(map); return (KERN_PROTECTION_FAILURE); } @@ -1761,7 +1988,12 @@ vm_map_protect(vm_map_t map, vm_offset_t start, vm_offset_t end, while ((current != &map->header) && (current->start < end)) { vm_prot_t old_prot; - vm_map_clip_end(map, current, end); + if (current->eflags & MAP_ENTRY_IS_HOLDER) { + current = current->next; + continue; + } + + vm_map_clip_end(map, ¤t, end); old_prot = current->protection; if (set_max) @@ -1840,8 +2072,12 @@ vm_map_madvise( VM_MAP_RANGE_CHECK(map, start, end); if (vm_map_lookup_entry(map, start, &entry)) { - if (modify_map) - vm_map_clip_start(map, entry, start); + if (modify_map) { + if (entry->eflags & MAP_ENTRY_IS_HOLDER) + entry = entry->next; + else + vm_map_clip_start(map, &entry, start); + } } else { entry = entry->next; } @@ -1857,10 +2093,11 @@ vm_map_madvise( (current != &map->header) && (current->start < end); current = current->next ) { - if (current->eflags & MAP_ENTRY_IS_SUB_MAP) + if ((current->eflags & (MAP_ENTRY_IS_SUB_MAP | + MAP_ENTRY_IS_HOLDER))) continue; - vm_map_clip_end(map, current, end); + vm_map_clip_end(map, ¤t, end); switch (behav) { case MADV_NORMAL: @@ -1907,7 +2144,8 @@ vm_map_madvise( ) { vm_offset_t useStart; - if (current->eflags & MAP_ENTRY_IS_SUB_MAP) + if ((current->eflags & (MAP_ENTRY_IS_SUB_MAP | + MAP_ENTRY_IS_HOLDER))) continue; pindex = OFF_TO_IDX(current->offset); @@ -1969,15 +2207,18 @@ vm_map_inherit(vm_map_t map, vm_offset_t start, vm_offset_t end, } vm_map_lock(map); VM_MAP_RANGE_CHECK(map, start, end); - if (vm_map_lookup_entry(map, start, &temp_entry)) { + if (vm_map_lookup_entry(map, start, &temp_entry) && + (temp_entry->eflags & MAP_ENTRY_IS_HOLDER) == 0) { entry = temp_entry; - vm_map_clip_start(map, entry, start); + vm_map_clip_start(map, &entry, start); } else entry = temp_entry->next; while ((entry != &map->header) && (entry->start < end)) { - vm_map_clip_end(map, entry, end); - entry->inheritance = new_inheritance; - vm_map_simplify_entry(map, entry); + if (!(entry->eflags & MAP_ENTRY_IS_HOLDER)) { + vm_map_clip_end(map, &entry, end); + entry->inheritance = new_inheritance; + vm_map_simplify_entry(map, entry); + } entry = entry->next; } vm_map_unlock(map); @@ -2059,8 +2300,8 @@ vm_map_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end, last_timestamp = map->timestamp; continue; } - vm_map_clip_start(map, entry, start); - vm_map_clip_end(map, entry, end); + vm_map_clip_start(map, &entry, start); + vm_map_clip_end(map, &entry, end); /* * Mark the entry in case the map lock is released. (See * above.) @@ -2100,6 +2341,10 @@ done: } entry = first_entry; while (entry != &map->header && entry->start < end) { + if ((entry->eflags & MAP_ENTRY_IS_HOLDER) != 0) { + entry = entry->next; + continue; + } if (rv == KERN_SUCCESS && (!user_unwire || (entry->eflags & MAP_ENTRY_USER_WIRED))) { if (user_unwire) @@ -2116,6 +2361,8 @@ done: } KASSERT(entry->eflags & MAP_ENTRY_IN_TRANSITION, ("vm_map_unwire: in-transition flag missing")); + if (entry->eflags & MAP_ENTRY_DEFER_WRITECNT) + vm_map_entry_inc_vn_wcnt(map, entry, NULL, TRUE); entry->eflags &= ~MAP_ENTRY_IN_TRANSITION; if (entry->eflags & MAP_ENTRY_NEEDS_WAKEUP) { entry->eflags &= ~MAP_ENTRY_NEEDS_WAKEUP; @@ -2205,8 +2452,8 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end, last_timestamp = map->timestamp; continue; } - vm_map_clip_start(map, entry, start); - vm_map_clip_end(map, entry, end); + vm_map_clip_start(map, &entry, start); + vm_map_clip_end(map, &entry, end); /* * Mark the entry in case the map lock is released. (See * above.) @@ -2305,6 +2552,10 @@ done: } entry = first_entry; while (entry != &map->header && entry->start < end) { + if ((entry->eflags & MAP_ENTRY_IS_HOLDER) != 0) { + entry = entry->next; + continue; + } if ((entry->eflags & MAP_ENTRY_WIRE_SKIPPED) != 0) goto next_entry_done; if (rv == KERN_SUCCESS) { @@ -2332,6 +2583,8 @@ done: next_entry_done: KASSERT(entry->eflags & MAP_ENTRY_IN_TRANSITION, ("vm_map_wire: in-transition flag missing")); + if (entry->eflags & MAP_ENTRY_DEFER_WRITECNT) + vm_map_entry_inc_vn_wcnt(map, entry, NULL, TRUE); entry->eflags &= ~(MAP_ENTRY_IN_TRANSITION|MAP_ENTRY_WIRE_SKIPPED); if (entry->eflags & MAP_ENTRY_NEEDS_WAKEUP) { entry->eflags &= ~MAP_ENTRY_NEEDS_WAKEUP; @@ -2506,21 +2759,30 @@ vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry) * map. */ int -vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end) +vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end, + boolean_t fixed) { - vm_map_entry_t entry; - vm_map_entry_t first_entry; + vm_map_entry_t entry, first_entry, tmp_entry, holder_entry; + unsigned int last_timestamp; + vm_offset_t saved_start; VM_MAP_ASSERT_LOCKED(map); /* * Find the start of the region, and clip it */ +reclip_start: if (!vm_map_lookup_entry(map, start, &first_entry)) entry = first_entry->next; else { entry = first_entry; - vm_map_clip_start(map, entry, start); + if (entry->eflags & MAP_ENTRY_IS_HOLDER) { + entry->eflags |= MAP_ENTRY_NEEDS_WAKEUP; + (void) vm_map_unlock_and_wait(map, 0); + vm_map_lock(map); + goto reclip_start; + } + vm_map_clip_start(map, &entry, start); } /* @@ -2529,6 +2791,7 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end) while ((entry != &map->header) && (entry->start < end)) { vm_map_entry_t next; + saved_start = entry->start; /* * Wait for wiring or unwiring of an entry to complete. * Also wait for any system wirings to disappear on @@ -2536,16 +2799,54 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end) */ if ((entry->eflags & MAP_ENTRY_IN_TRANSITION) != 0 || (vm_map_pmap(map) != kernel_pmap && - vm_map_entry_system_wired_count(entry) != 0)) { - unsigned int last_timestamp; - vm_offset_t saved_start; - vm_map_entry_t tmp_entry; - - saved_start = entry->start; + vm_map_entry_system_wired_count(entry) != 0) || + entry->pin_count != 0) { entry->eflags |= MAP_ENTRY_NEEDS_WAKEUP; last_timestamp = map->timestamp; + + if (start < saved_start && fixed) { + /* + * Create the transient entry that + * holds already freed address space. + */ + holder_entry = vm_map_entry_create(map); + holder_entry->start = start; + holder_entry->end = saved_start; + holder_entry->object.vm_object = NULL; + holder_entry->offset = 0; + holder_entry->eflags = MAP_ENTRY_IN_TRANSITION | + MAP_ENTRY_IS_HOLDER; + holder_entry->protection = VM_PROT_NONE; + holder_entry->max_protection = VM_PROT_NONE; + holder_entry->inheritance = VM_INHERIT_NONE; + holder_entry->wired_count = 0; + holder_entry->pin_count = 0; + vm_map_entry_link(map, entry->prev, holder_entry); + } (void) vm_map_unlock_and_wait(map, 0); vm_map_lock(map); + + if (start < saved_start && fixed) { + + /* + * Holder entry may be clipped, but + * not removed. + */ + if (!vm_map_lookup_entry(map, start, &holder_entry)) + panic("vm_map_delete: lost holder"); + while (holder_entry->start < saved_start) { + tmp_entry = holder_entry->next; + KASSERT(holder_entry->eflags & MAP_ENTRY_IS_HOLDER, + ("vm_map_delete: not holder %p", holder_entry)); + if (holder_entry->eflags & MAP_ENTRY_NEEDS_WAKEUP) + vm_map_wakeup(map); + if (holder_entry->object.vm_object != NULL) + vm_object_deallocate(holder_entry->object.vm_object); + vm_map_entry_unlink(map, holder_entry); + vm_map_entry_dispose(map, holder_entry); + holder_entry = tmp_entry; + } + } if (last_timestamp + 1 != map->timestamp) { /* * Look again for the entry because the map was @@ -2558,13 +2859,13 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end) entry = tmp_entry->next; else { entry = tmp_entry; - vm_map_clip_start(map, entry, + vm_map_clip_start(map, &entry, saved_start); } } continue; } - vm_map_clip_end(map, entry, end); + vm_map_clip_end(map, &entry, end); next = entry->next; @@ -2584,10 +2885,21 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end) * page frames may be reallocated, and any modify bits * will be set in the wrong object!) */ + last_timestamp = map->timestamp; vm_map_entry_delete(map, entry); entry->next = map->deferred_freelist; map->deferred_freelist = entry; - entry = next; +#ifdef INVARIANTS + entry->eflags |= MAP_ENTRY_ON_FREELIST; +#endif + if (last_timestamp + 1 == map->timestamp) + entry = next; + else if (!vm_map_lookup_entry(map, saved_start, &tmp_entry)) + entry = tmp_entry->next; + else { + entry = tmp_entry; + vm_map_clip_start(map, &entry, saved_start); + } } return (KERN_SUCCESS); } @@ -2605,7 +2917,7 @@ vm_map_remove(vm_map_t map, vm_offset_t start, vm_offset_t end) vm_map_lock(map); VM_MAP_RANGE_CHECK(map, start, end); - result = vm_map_delete(map, start, end); + result = vm_map_delete(map, start, end, FALSE); vm_map_unlock(map); return (result); } @@ -2847,6 +3159,7 @@ vmspace_fork(struct vmspace *vm1) new_entry->eflags &= ~(MAP_ENTRY_USER_WIRED | MAP_ENTRY_IN_TRANSITION); new_entry->wired_count = 0; + new_entry->pin_count = 0; /* * Insert the entry into the new map -- we know we're @@ -2874,6 +3187,7 @@ vmspace_fork(struct vmspace *vm1) new_entry->eflags &= ~(MAP_ENTRY_USER_WIRED | MAP_ENTRY_IN_TRANSITION); new_entry->wired_count = 0; + new_entry->pin_count = 0; new_entry->object.vm_object = NULL; vm_map_entry_link(new_map, new_map->header.prev, new_entry); @@ -2884,11 +3198,22 @@ vmspace_fork(struct vmspace *vm1) } old_entry = old_entry->next; } + unlock_and_return: vm_map_unlock(old_map); - if (vm2 != NULL) + if (vm2 != NULL) { + for (new_entry = new_map->header.next; + new_entry != &new_map->header; new_entry = new_entry->next) { + if ((new_entry->eflags & MAP_ENTRY_DEFER_WRITECNT) != 0) { + new_entry->eflags &= ~MAP_ENTRY_DEFER_WRITECNT; + new_entry->eflags |= MAP_ENTRY_VN_WRITECNT; + } + if ((new_entry->eflags & MAP_ENTRY_VN_WRITECNT) != 0) + vm_map_entry_inc_vn_wcnt(new_map, new_entry, + NULL, FALSE); + } vm_map_unlock(new_map); - + } return (vm2); } @@ -2973,8 +3298,13 @@ vm_map_stack(vm_map_t map, vm_offset_t addrbos, vm_size_t max_ssize, /* Now set the avail_ssize amount. */ if (rv == KERN_SUCCESS) { - if (prev_entry != &map->header) - vm_map_clip_end(map, prev_entry, bot); + if (prev_entry != &map->header) { + if (prev_entry->eflags & MAP_ENTRY_IS_HOLDER) { + vm_map_unlock(map); + return (KERN_NO_SPACE); + } + vm_map_clip_end(map, &prev_entry, bot); + } new_entry = prev_entry->next; if (new_entry->end != top || new_entry->start != bot) panic("Bad entry start/end for new stack entry"); @@ -3144,8 +3474,16 @@ Retry: /* Adjust the available stack space by the amount we grew. */ if (rv == KERN_SUCCESS) { - if (prev_entry != &map->header) - vm_map_clip_end(map, prev_entry, addr); + if (prev_entry != &map->header) { + if ((prev_entry->eflags & MAP_ENTRY_IS_HOLDER) && + (addr < prev_entry->end)) { + vm_map_delete(map, addr, + stack_entry->start, FALSE); + vm_map_unlock(map); + return (KERN_NO_SPACE); + } + vm_map_clip_end(map, &prev_entry, addr); + } new_entry = prev_entry->next; KASSERT(new_entry == stack_entry->prev, ("foo")); KASSERT(new_entry->end == stack_entry->start, ("foo")); @@ -3179,6 +3517,13 @@ Retry: stack_entry->offset, (vm_size_t)(stack_entry->end - stack_entry->start), (vm_size_t)grow_amount)) { + if (next_entry != &map->header && + (next_entry->eflags & MAP_ENTRY_IS_HOLDER) && + (addr > next_entry->start)) { + vm_map_unlock(map); + return (KERN_NO_SPACE); + } + map->size += (addr - stack_entry->end); /* Update the current entry. */ stack_entry->end = addr; @@ -3187,7 +3532,7 @@ Retry: rv = KERN_SUCCESS; if (next_entry != &map->header) - vm_map_clip_start(map, next_entry, addr); + vm_map_clip_start(map, &next_entry, addr); } else rv = KERN_FAILURE; } @@ -3527,6 +3872,167 @@ vm_map_lookup_done(vm_map_t map, vm_map_entry_t entry) vm_map_unlock_read(map); } +static boolean_t +vm_map_unpin_entries(vm_map_t map, struct uio *uiop, int pinned_entries) +{ + vm_offset_t start; + struct iovec *iov; + vm_map_entry_t entry; + int i, acc, wire; + boolean_t need_wakeup; + + iov = uiop->uio_iov; + need_wakeup = FALSE; + + for (i = 0, acc = 0; acc < pinned_entries; iov++, i++) { + KASSERT(i < uiop->uio_iovcnt, ("wireio: iovcnt overflow %d %d %d", + i, uiop->uio_iovcnt, pinned_entries)); + wire = round_page(iov->iov_len); + if (acc + wire > pinned_entries) + wire = pinned_entries - acc; + start = trunc_page((vm_offset_t)iov->iov_base); + for (;;) { + if (!vm_map_lookup_entry(map, start, &entry)) { +#ifdef INVARIANTS + panic("vm_unwireuio: hole"); +#endif + } + KASSERT(entry->pin_count > 0, ("pin_count %p", entry)); + if (--entry->pin_count == 0 && + (entry->eflags & MAP_ENTRY_NEEDS_WAKEUP)) { + entry->eflags &= ~MAP_ENTRY_NEEDS_WAKEUP; + need_wakeup = TRUE; + } + if (entry->end >= start + wire) { + acc += wire; + break; + } else { + acc += entry->end - start; + wire -= entry->end - start; + start = entry->end; + } + } + } + return (need_wakeup); +} + +/* + * vm_wireuio + * + * Given userspace struct uio, we set up vm state such that after the + * successfull return there will be no page faults during uiomove with + * this uio until vm_unwireuio is called. At most wire_bytes bytes of + * the user address space are held. + * + * Function performs this by first pinning all map entries that will + * be referenced. This guarantees that our ranges of user address + * space cannot be remmapped during the operation. Then, all accessed + * pages are faulted in and held. + */ +int +vm_wireuio(struct uio *uiop, struct vm_page *m_hold[], int wire_bytes, + int *wired_pages) +{ + vm_map_t map; + vm_offset_t start, start1; + struct iovec *iov; + vm_map_entry_t entry; + struct vm_page **m_hold1; + int i, acc, wire, wire_pages, pinned_entries, rv, prot; + int error; + boolean_t need_wakeup; + + KASSERT(round_page(wire_bytes) == wire_bytes, + ("wireuio: wire_bytes is not page-size aligned")); + KASSERT(uiop->uio_segflg == UIO_USERSPACE, + ("wireuio: !UIO_USERSPACE")); + + error = 0; + prot = uiop->uio_rw == UIO_READ ? VM_PROT_WRITE : VM_PROT_READ; + m_hold1 = m_hold; + pinned_entries = 0; + *wired_pages = 0; + map = &uiop->uio_td->td_proc->p_vmspace->vm_map; + iov = uiop->uio_iov; + + /* + * Do the pass over iov. + */ + for (i = 0, acc = 0; acc < wire_bytes; iov++, i++) { + wire = round_page(iov->iov_len); + if (acc + wire > wire_bytes) + wire = wire_bytes - acc; + acc += wire; + wire_pages = btoc(wire); + start1 = start = trunc_page((vm_offset_t)iov->iov_base); + if (start < vm_map_min(map) || start + wire > vm_map_max(map) || + start > start + wire) { + error = EINVAL; + goto fault; + } + vm_map_lock(map); + + /* + * Pin each entry referenced by addresses in iov. + */ + for (;;) { + if (!vm_map_lookup_entry(map, start1, &entry) || + (entry->eflags & MAP_ENTRY_IS_HOLDER)) + goto fault_map_locked; + entry->pin_count++; + if (entry->end >= start1 + wire) { + pinned_entries += wire; + break; + } else { + pinned_entries += entry->end - start1; + wire -= entry->end - start1; + start1 = entry->end; + } + } + vm_map_unlock(map); + + /* + * If entries are successfully pinned, the + * corresponding pages are faulted in and held. + */ + rv = vm_fault_hold_user_pages(map, start, m_hold1, wire_pages, + prot); + if (rv != KERN_SUCCESS) { + error = EFAULT; + goto fault; + } + *wired_pages += wire_pages; + m_hold1 += wire_pages; + } + return (0); + fault: + vm_map_lock(map); + fault_map_locked: + need_wakeup = vm_map_unpin_entries(map, uiop, pinned_entries); + vm_map_unlock(map); + vm_fault_unhold_pages(m_hold, *wired_pages); + if (need_wakeup) + vm_map_wakeup(map); + return (error); +} + +void +vm_unwireuio(struct uio *uiop, struct vm_page *m_hold[], int wired_pages) +{ + vm_map_t map; + boolean_t need_wakeup; + + map = &uiop->uio_td->td_proc->p_vmspace->vm_map; + + vm_fault_unhold_pages(m_hold, wired_pages); + + vm_map_lock(map); + need_wakeup = vm_map_unpin_entries(map, uiop, ctob(wired_pages)); + vm_map_unlock(map); + if (need_wakeup) + vm_map_wakeup(map); +} + #include "opt_ddb.h" #ifdef DDB #include diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h index 70c3a0b..9310718 100644 --- a/sys/vm/vm_map.h +++ b/sys/vm/vm_map.h @@ -114,6 +114,7 @@ struct vm_map_entry { vm_inherit_t inheritance; /* inheritance */ int wired_count; /* can be paged if = 0 */ vm_pindex_t lastr; /* last read */ + unsigned pin_count; /* non-exclusive pin count */ }; #define MAP_ENTRY_NOSYNC 0x0001 @@ -133,11 +134,22 @@ struct vm_map_entry { #define MAP_ENTRY_IN_TRANSITION 0x0100 /* entry being changed */ #define MAP_ENTRY_NEEDS_WAKEUP 0x0200 /* waiters in transition */ #define MAP_ENTRY_NOCOREDUMP 0x0400 /* don't include in a core */ +#define MAP_ENTRY_IS_HOLDER 0x0800 /* holds space for vm_map_fixed */ #define MAP_ENTRY_GROWS_DOWN 0x1000 /* Top-down stacks */ #define MAP_ENTRY_GROWS_UP 0x2000 /* Bottom-up stacks */ -#define MAP_ENTRY_WIRE_SKIPPED 0x4000 +#define MAP_ENTRY_VN_WRITECNT 0x4000 /* writeable mapping for a vnode */ +#define MAP_ENTRY_DEFER_WRITECNT 0x8000 /* increment writecount when + dropping the transitioning state */ +#ifdef INVARIANTS +#define MAP_ENTRY_ON_FREELIST 0x10000 +#define MAP_ENTRY_LINKED 0x20000 +#define MAP_ENTRY_UNLINKED 0x40000 +#endif + +#define MAP_ENTRY_WIRE_SKIPPED 0x80000 + #ifdef _KERNEL static __inline u_char @@ -265,7 +277,8 @@ vmspace_pmap(struct vmspace *vmspace) */ void _vm_map_lock(vm_map_t map, const char *file, int line); -void _vm_map_unlock(vm_map_t map, const char *file, int line); +void _vm_map_unlock(vm_map_t map, boolean_t process_freelist, const char *file, + int line); void _vm_map_lock_read(vm_map_t map, const char *file, int line); void _vm_map_unlock_read(vm_map_t map, const char *file, int line); int _vm_map_trylock(vm_map_t map, const char *file, int line); @@ -277,7 +290,7 @@ int vm_map_unlock_and_wait(vm_map_t map, int timo); void vm_map_wakeup(vm_map_t map); #define vm_map_lock(map) _vm_map_lock(map, LOCK_FILE, LOCK_LINE) -#define vm_map_unlock(map) _vm_map_unlock(map, LOCK_FILE, LOCK_LINE) +#define vm_map_unlock(map) _vm_map_unlock(map, TRUE, LOCK_FILE, LOCK_LINE) #define vm_map_lock_read(map) _vm_map_lock_read(map, LOCK_FILE, LOCK_LINE) #define vm_map_unlock_read(map) _vm_map_unlock_read(map, LOCK_FILE, LOCK_LINE) #define vm_map_trylock(map) _vm_map_trylock(map, LOCK_FILE, LOCK_LINE) @@ -339,7 +352,7 @@ long vmspace_wired_count(struct vmspace *vmspace); #ifdef _KERNEL boolean_t vm_map_check_protection (vm_map_t, vm_offset_t, vm_offset_t, vm_prot_t); vm_map_t vm_map_create(pmap_t, vm_offset_t, vm_offset_t); -int vm_map_delete(vm_map_t, vm_offset_t, vm_offset_t); +int vm_map_delete(vm_map_t, vm_offset_t, vm_offset_t, boolean_t); int vm_map_find(vm_map_t, vm_object_t, vm_ooffset_t, vm_offset_t *, vm_size_t, int, vm_prot_t, vm_prot_t, int); int vm_map_fixed(vm_map_t, vm_object_t, vm_ooffset_t, vm_offset_t, vm_size_t, @@ -362,7 +375,7 @@ void vm_map_startup (void); int vm_map_submap (vm_map_t, vm_offset_t, vm_offset_t, vm_map_t); int vm_map_sync(vm_map_t, vm_offset_t, vm_offset_t, boolean_t, boolean_t); int vm_map_madvise (vm_map_t, vm_offset_t, vm_offset_t, int); -void vm_map_simplify_entry (vm_map_t, vm_map_entry_t); +void vm_map_simplify_entry(vm_map_t, vm_map_entry_t); void vm_init2 (void); int vm_map_stack (vm_map_t, vm_offset_t, vm_size_t, vm_prot_t, vm_prot_t, int); int vm_map_growstack (struct proc *p, vm_offset_t addr); @@ -371,5 +384,6 @@ int vm_map_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end, int vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end, int flags); int vmspace_swap_count (struct vmspace *vmspace); + #endif /* _KERNEL */ #endif /* _VM_MAP_ */ diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 6cc0acc..e5ab46e 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -117,7 +117,7 @@ vmmapentry_rsrc_init(dummy) } static int vm_mmap_vnode(struct thread *, vm_size_t, vm_prot_t, vm_prot_t *, - int *, struct vnode *, vm_ooffset_t, vm_object_t *); + int *, struct vnode *, vm_ooffset_t, vm_object_t *, struct vnode **, int *); static int vm_mmap_cdev(struct thread *, vm_size_t, vm_prot_t, vm_prot_t *, int *, struct cdev *, vm_ooffset_t, vm_object_t *); static int vm_mmap_shm(struct thread *, vm_size_t, vm_prot_t, vm_prot_t *, @@ -593,7 +593,7 @@ munmap(td, uap) } #endif /* returns nothing but KERN_SUCCESS anyway */ - vm_map_delete(map, addr, addr + size); + vm_map_delete(map, addr, addr + size, FALSE); vm_map_unlock(map); return (0); } @@ -1142,7 +1142,8 @@ munlock(td, uap) int vm_mmap_vnode(struct thread *td, vm_size_t objsize, vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, - struct vnode *vp, vm_ooffset_t foff, vm_object_t *objp) + struct vnode *vp, vm_ooffset_t foff, vm_object_t *objp, + struct vnode **rvp, int *vfslocked) { struct vattr va; void *handle; @@ -1150,14 +1151,22 @@ vm_mmap_vnode(struct thread *td, vm_size_t objsize, struct mount *mp; struct cdevsw *dsw; struct ucred *cred; - int error, flags, type; - int vfslocked; + int error, flags, type, locktype; mp = vp->v_mount; cred = td->td_ucred; - vfslocked = VFS_LOCK_GIANT(mp); - if ((error = vget(vp, LK_SHARED, td)) != 0) { - VFS_UNLOCK_GIANT(vfslocked); + + /* + * Need to bump v_writecount for shared writable mapping in + * vm_map_insert. + */ + if ((*maxprotp & VM_PROT_WRITE) && (*flagsp & MAP_SHARED)) + locktype = LK_EXCLUSIVE; + else + locktype = LK_SHARED; + *vfslocked = VFS_LOCK_GIANT(mp); + if ((error = vget(vp, locktype, td)) != 0) { + VFS_UNLOCK_GIANT(*vfslocked); return (error); } flags = *flagsp; @@ -1173,13 +1182,15 @@ vm_mmap_vnode(struct thread *td, vm_size_t objsize, if (obj->handle != vp) { vput(vp); vp = (struct vnode*)obj->handle; - vget(vp, LK_SHARED, td); + vget(vp, locktype, td); } type = OBJT_VNODE; handle = vp; + *rvp = vp; } else if (vp->v_type == VCHR) { type = OBJT_DEVICE; handle = vp->v_rdev; + *rvp = vp; dsw = dev_refthread(handle); if (dsw == NULL) { @@ -1250,8 +1261,10 @@ vm_mmap_vnode(struct thread *td, vm_size_t objsize, vfs_mark_atime(vp, cred); done: - vput(vp); - VFS_UNLOCK_GIANT(vfslocked); + if (error != 0) { + vput(vp); + VFS_UNLOCK_GIANT(*vfslocked); + } return (error); } @@ -1355,8 +1368,9 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, boolean_t fitit; vm_object_t object = NULL; int rv = KERN_SUCCESS; - int docow, error; + int docow, error, vfslocked; struct thread *td = curthread; + struct vnode *vp; if (size == 0) return (0); @@ -1390,6 +1404,9 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, return (EINVAL); fitit = FALSE; } + vfslocked = 0; + vp = NULL; + /* * Lookup/allocate object. */ @@ -1400,7 +1417,7 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, break; case OBJT_VNODE: error = vm_mmap_vnode(td, size, prot, &maxprot, &flags, - handle, foff, &object); + handle, foff, &object, &vp, &vfslocked); break; case OBJT_SWAP: error = vm_mmap_shm(td, size, prot, &maxprot, &flags, @@ -1448,6 +1465,10 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, rv = vm_map_fixed(map, object, foff, *addr, size, prot, maxprot, docow); + if (vp != NULL) { + vput(vp); + VFS_UNLOCK_GIANT(vfslocked); + } if (rv != KERN_SUCCESS) { /* * Lose the object reference. Will destroy the diff --git a/sys/vm/vm_param.h b/sys/vm/vm_param.h index 2ff2603..d866925 100644 --- a/sys/vm/vm_param.h +++ b/sys/vm/vm_param.h @@ -125,6 +125,7 @@ struct xswdev { #define KERN_RESOURCE_SHORTAGE 6 #define KERN_NOT_RECEIVER 7 #define KERN_NO_ACCESS 8 +#define KERN_VMUIODEADLOCK 9 #ifndef ASSEMBLER #ifdef _KERNEL diff --git a/sys/vm/vm_unix.c b/sys/vm/vm_unix.c index 6bb9917..3bd2ddd 100644 --- a/sys/vm/vm_unix.c +++ b/sys/vm/vm_unix.c @@ -138,7 +138,7 @@ obreak(td, uap) do_map_wirefuture = TRUE; } } else if (new < old) { - rv = vm_map_delete(&vm->vm_map, new, old); + rv = vm_map_delete(&vm->vm_map, new, old, FALSE); if (rv != KERN_SUCCESS) { error = ENOMEM; goto done; diff --git a/tools/regression/file/uio/uio.c b/tools/regression/file/uio/uio.c new file mode 100644 index 0000000..d857605 --- /dev/null +++ b/tools/regression/file/uio/uio.c @@ -0,0 +1,116 @@ +/*- + * Copyright (c) 2009 Konstantin Belousov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int chunk_cnt = 1024; +int chunk_size = 1024; + +int +main(int argc, char *argv[]) +{ + struct iovec *wiov, *riov; + char **wdata, **rdata; + int fd, i; + ssize_t io_error; + + if (argc < 2) { + fprintf(stderr, "Usage: uio file [chunk count [chunk size]]\n"); + return (2); + } + fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + if (fd == -1) { + fprintf(stderr, "Failed to create %s: %s\n", + argv[1], strerror(errno)); + return (1); + } + + if (argc > 2) + chunk_cnt = atoi(argv[2]); + if (argc > 3) + chunk_size = atoi(argv[3]); + + wiov = calloc(chunk_cnt, sizeof(*wiov)); + wdata = calloc(chunk_cnt, sizeof(*wdata)); + + riov = calloc(chunk_cnt, sizeof(*riov)); + rdata = calloc(chunk_cnt, sizeof(*rdata)); + + for (i = 0; i < chunk_cnt; i++) { + rdata[i] = malloc(chunk_size); + riov[i].iov_base = rdata[i]; + riov[i].iov_len = chunk_size; + + wdata[i] = malloc(chunk_size); + memset(wdata[i], i, chunk_size); + wiov[i].iov_base = wdata[i]; + wiov[i].iov_len = chunk_size; + } + + io_error = writev(fd, wiov, chunk_cnt); + if (io_error == -1) { + fprintf(stderr, "write failed: %s\n", strerror(errno)); + return (1); + } else if (io_error != chunk_cnt * chunk_size) { + fprintf(stderr, "truncated write: %d %d\n", + io_error, chunk_cnt * chunk_size); + return (1); + } + + if (lseek(fd, 0, SEEK_SET) == -1) { + fprintf(stderr, "lseek failed: %s\n", strerror(errno)); + return (1); + } + + io_error = readv(fd, riov, chunk_cnt); + if (io_error == -1) { + fprintf(stderr, "read failed: %s\n", strerror(errno)); + return (1); + } else if (io_error != chunk_cnt * chunk_size) { + fprintf(stderr, "truncated read: %d %d\n", + io_error, chunk_cnt * chunk_size); + return (1); + } + + for (i = 0; i < chunk_cnt; i++) { + if (memcmp(rdata[i], wdata[i], chunk_size) != 0) { + fprintf(stderr, "chunk %d differs\n", i); + return (1); + } + } + + return (0); +} diff --git a/tools/regression/ufs/ba_clrbuf/ba_clrbuf.c b/tools/regression/ufs/ba_clrbuf/ba_clrbuf.c new file mode 100644 index 0000000..9376648 --- /dev/null +++ b/tools/regression/ufs/ba_clrbuf/ba_clrbuf.c @@ -0,0 +1,129 @@ +/*- + * Copyright (c) 2009 Konstantin Belousov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const int blks = 2; + +static void +flush_buffers(int fd) +{ + struct stat st; + char *addr; + int error; + + printf("Flushing buffers\n"); + error = fstat(fd, &st); + if (error == -1) + err(2, "stat"); + fsync(fd); + addr = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == (char *)-1) + err(2, "mmap"); + error = msync(addr, st.st_size, MS_SYNC | MS_INVALIDATE); + if (error == -1) + err(2, "msync"); + munmap(addr, st.st_size); +} + +int +main(int argc, char *argv[]) +{ + struct statfs fst; + char *data, *vrfy; + size_t sz; + int fd, i, error, ret; + + if (argc < 2) + errx(2, "Usage: ba_clrbuf file"); + + fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + if (fd == -1) + err(2, "Failed to create %s", argv[1]); + + if (fstatfs(fd, &fst) == -1) + err(2, "stat"); + + sz = fst.f_iosize * blks; + data = malloc(sz); + if (data == NULL) + err(2, "malloc"); + vrfy = malloc(sz); + if (vrfy == NULL) + err(2, "malloc"); + for (i = 0; i < (int)sz; i++) + data[i] = i; + error = write(fd, data, sz); + if (error == -1) + err(2, "write"); + else if (error != (int)sz) + errx(2, "Short write %d %d", error, sz); + + flush_buffers(fd); + + error = lseek(fd, 0, SEEK_SET); + if (error == -1) + err(2, "lseek 0"); + else if (error != 0) + errx(2, "lseek 0 returned %d", error); + error = write(fd, NULL, fst.f_iosize); + printf("faulty write, error %s\n", strerror(errno)); + + error = lseek(fd, 0, SEEK_SET); + if (error == -1) + err(2, "lseek 0/2"); + else if (error != 0) + errx(2, "lseek 0/2 returned %d", error); + error = read(fd, vrfy, sz); + if (error == -1) + err(2, "read"); + else if (error != (int)sz) + errx(2, "short read %d %d", error, sz); + + if (memcmp(data, vrfy, fst.f_iosize) != 0) { + printf("Zero block corrupted, byte at 0 is %x\n", + (unsigned char)vrfy[0]); + ret = 1; + } else { + printf("No corruption\n"); + ret = 0; + } + + return (ret); +} -- Test scenario: init 6