Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Jul 2009 16:24:29 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        freebsd-current@freebsd.org
Subject:   Re: Process stuck in vmmaps on 8.0-BETA1
Message-ID:  <20090710132429.GA55190@deviant.kiev.zoral.com.ua>
In-Reply-To: <20090710114234.GF32316@rwpc12.mby.riverwillow.net.au>
References:  <20090709060556.GA27373@rwpc12.mby.riverwillow.net.au> <a31046fc0907082342g1343b138g2fc38fda890b582a@mail.gmail.com> <20090709073054.GB27373@rwpc12.mby.riverwillow.net.au> <20090709085242.GC27373@rwpc12.mby.riverwillow.net.au> <20090709142121.GS55190@deviant.kiev.zoral.com.ua> <20090710035849.GB31950@rwpc12.mby.riverwillow.net.au> <1247214510.2437.1693.camel@strangepork.london.mintel.ad> <20090710114234.GF32316@rwpc12.mby.riverwillow.net.au>

next in thread | previous in thread | raw e-mail | index | archive | help

--zYtRAvLPyLojxZ7Y
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Fri, Jul 10, 2009 at 09:42:34PM +1000, John Marshall wrote:
> rwsrv05# procstat 1270
>   PID  PPID  PGID   SID  TSID THR LOGIN    WCHAN     EMUL          COMM  =
     =20
>  1270     1  1270  1270     0   1 john     vmmaps    FreeBSD ELF32 ntpd  =
     =20
>=20
> rwsrv05# procstat -k 1270
>   PID    TID COMM             TDNAME           KSTACK                    =
  =20
>  1270 100184 ntpd             -                mi_switch sleepq_switch sl=
eepq_wait _sleep vm_map_unlock_and_wait vm_map_delete vm_map_fixed vm_mmap =
mmap syscall Xint0x80_syscall=20
>=20
> rwsrv05# procstat -v 1270
>   PID      START        END PRT  RES PRES REF SHD FL TP PATH
>  1270  0x8048000  0x807e000 r-x   54   60   2   1 CN vn /usr/local/bin/nt=
pd
>  1270  0x807e000  0x8080000 rw-    2    0   1   0 C- vn /usr/local/bin/nt=
pd
>  1270  0x8080000  0x8100000 rw-  128    0   1   0 C- df=20
>  1270 0x2807e000 0x280ab000 r-x   45    0 170  75 CN vn /libexec/ld-elf.s=
o.1
>  1270 0x280ab000 0x280ad000 rw-    2    0   1   0 C- vn /libexec/ld-elf.s=
o.1
>  1270 0x280ad000 0x280c0000 rw-   19    0   1   0 C- df=20
>  1270 0x280c0000 0x280d7000 r-x   23    0   1   0 CN vn /lib/libm.so.5
>  1270 0x280d7000 0x280d8000 r-x    1    0   1   0 CN vn /lib/libm.so.5
>  1270 0x280d8000 0x280d9000 rw-    1    0   1   0 C- vn /lib/libm.so.5
>  1270 0x280d9000 0x28211000 r-x  312    0   1   0 CN vn /lib/libcrypto.so=
.5
>  1270 0x28211000 0x28212000 r-x    1    0   1   0 CN vn /lib/libcrypto.so=
.5
>  1270 0x28212000 0x2822a000 rw-   24    0   1   0 C- vn /lib/libcrypto.so=
.5
>  1270 0x2822a000 0x2822c000 rw-    2    0   1   0 C- df=20
>  1270 0x2822c000 0x28232000 r-x    6    0   1   0 CN vn /lib/libkvm.so.4
>  1270 0x28232000 0x28233000 r-x    1    0   1   0 CN vn /lib/libkvm.so.4
>  1270 0x28233000 0x28234000 rw-    1    0   1   0 C- vn /lib/libkvm.so.4
>  1270 0x28234000 0x2824c000 r-x   24    0   1   0 CN vn /usr/lib/libelf.s=
o.1
>  1270 0x2824c000 0x2824d000 r-x    1    0   1   0 CN vn /usr/lib/libelf.s=
o.1
>  1270 0x2824d000 0x2824e000 rw-    1    0   1   0 C- vn /usr/lib/libelf.s=
o.1
>  1270 0x2824e000 0x28251000 r-x    3    0  15  10 CN vn /usr/lib/librt.so=
.1
>  1270 0x28251000 0x28252000 r-x    1    0   1   0 CN vn /usr/lib/librt.so=
.1
>  1270 0x28252000 0x28253000 rw-    1    0   1   0 C- vn /usr/lib/librt.so=
.1
>  1270 0x28253000 0x28260000 r-x   13    0   1   0 CN vn /lib/libmd.so.4
>  1270 0x28260000 0x28261000 r-x    1    0   1   0 CN vn /lib/libmd.so.4
>  1270 0x28261000 0x28262000 rw-    1    0   1   0 C- vn /lib/libmd.so.4
>  1270 0x28262000 0x28351000 r-x  239    0   1   0 CN vn /lib/libc.so.7
>  1270 0x28351000 0x28352000 r-x    1    0   1   0 CN vn /lib/libc.so.7
>  1270 0x28352000 0x28358000 rw-    6    0   1   0 C- vn /lib/libc.so.7
>  1270 0x28358000 0x2836e000 rw-   22    0   1   0 C- df=20
>  1270 0x2836e000 0x2837a000 ---    0    0   0   0 -- --=20
>  1270 0x28400000 0x28500000 rw-  256    0   1   0 C- df=20
>  1270 0xbfbe0000 0xbfc00000 rwx   32    0   1   0 C- df=20
>=20
> rwsrv05# kgdb kernel.debug /dev/mem
> GNU gdb 6.1.1 [FreeBSD]
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you =
are
> welcome to change it and/or distribute copies of it under certain conditi=
ons.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB.  Type "show warranty" for detail=
s.
> This GDB was configured as "i386-marcel-freebsd"...
> #0  sched_switch (td=3D0xc08af410, newtd=3D0xc4d4db40, flags=3D260)
>     at /usr/src/sys/kern/sched_ule.c:1864
> 1864			cpuid =3D PCPU_GET(cpuid);
> Ready to go.  Enter 'tr' to connect to the remote target
> with /dev/cuad0, 'tr /dev/cuad1' to connect to a different port
> or 'trf portno' to connect to the remote target with the firewire
> interface.  portno defaults to 5556.
>=20
> Type 'getsyms' after connection to load kld symbols.
>=20
> If you're debugging a local system, you can use 'kldsyms' instead
> to load the kld symbols.  That's a less obnoxious interface.
> (kgdb) proc 1270
> [Switching to thread 168 (Thread 100184)]#0  sched_switch (td=3D0xc592fd8=
0, newtd=3D0xc4d4db40, flags=3D0x104)
>     at /usr/src/sys/kern/sched_ule.c:1864
> 1864			cpuid =3D PCPU_GET(cpuid);
> (kgdb) bt
> #0  sched_switch (td=3D0xc592fd80, newtd=3D0xc4d4db40, flags=3D0x104) at =
/usr/src/sys/kern/sched_ule.c:1864
> During symbol reading, Incomplete CFI data; unspecified registers at 0xc0=
6009d6.
> #1  0xc05e788f in mi_switch (flags=3D0x104, newtd=3D0x0) at /usr/src/sys/=
kern/kern_synch.c:444
> #2  0xc061695c in sleepq_switch (wchan=3D0xc5909f00, pri=3D0x44) at /usr/=
src/sys/kern/subr_sleepqueue.c:505
> #3  0xc06175f5 in sleepq_wait (wchan=3D0xc5909f00, pri=3D0x44) at /usr/sr=
c/sys/kern/subr_sleepqueue.c:584
> #4  0xc05e7d39 in _sleep (ident=3D0xc5909f00, lock=3D0xc0a26724, priority=
=3D0x244, wmesg=3D0xc0837aa0 "vmmaps", timo=3D0x0)
>     at /usr/src/sys/kern/kern_synch.c:232
> #5  0xc0761a37 in vm_map_unlock_and_wait (map=3D0xc5909e80, timo=3D0x0) a=
t /usr/src/sys/vm/vm_map.c:638
> #6  0xc0761ae7 in vm_map_delete (map=3D0xc5909e80, start=3D0x2836e000, en=
d=3D0x28374000) at /usr/src/sys/vm/vm_map.c:2703
> #7  0xc07634ce in vm_map_fixed (map=3D0xc5909e80, object=3D0xc5254990, of=
fset=3D0x0, start=3D0x2836e000, length=3D0x6000,=20
>     prot=3D0x5, max=3D0x7, cow=3D0x112) at /usr/src/sys/vm/vm_map.c:1367
> #8  0xc0765ba8 in vm_mmap (map=3D0xc5909e80, addr=3D0xe787ac70, size=3D0x=
6000, prot=3DVariable "prot" is not available.
> ) at /usr/src/sys/vm/vm_mmap.c:1439
> #9  0xc076634f in mmap (td=3D0xc592fd80, uap=3D0xe787acf8) at /usr/src/sy=
s/vm/vm_mmap.c:390
> #10 0xc07bb6bf in syscall (frame=3D0xe787ad38) at /usr/src/sys/i386/i386/=
trap.c:1073
> #11 0xc07a0150 in Xint0x80_syscall () at /usr/src/sys/i386/i386/exception=
.s:261
> #12 0x00000033 in ?? ()
> Previous frame inner to this frame (corrupt stack?)
> (kgdb) f 6
> #6  0xc0761ae7 in vm_map_delete (map=3D0xc5909e80, start=3D0x2836e000, en=
d=3D0x28374000) at /usr/src/sys/vm/vm_map.c:2703
> 2703				(void) vm_map_unlock_and_wait(map, 0);
> (kgdb) p *entry
> $1 =3D {
>   prev =3D 0xc5812b40,=20
>   next =3D 0xc59ec7e0,=20
>   left =3D 0xc5812b40,=20
>   right =3D 0xc59ec7e0,=20
>   start =3D 0x2836e000,=20
>   end =3D 0x2837a000,=20
>   avail_ssize =3D 0x0,=20
>   adj_free =3D 0x86000,=20
>   max_free =3D 0x976e0000,=20
>   object =3D {
>     vm_object =3D 0x0,=20
>     sub_map =3D 0x0
>   },=20
>   offset =3D 0x0,=20
>   eflags =3D 0x600,=20
>   protection =3D 0x0,=20
>   max_protection =3D 0x7,=20
>   inheritance =3D 0x1,=20
>   wired_count =3D 0xffffffff,=20
>   lastr =3D 0x1c,=20
>   uip =3D 0x0
> }
> (kgdb)=20

Thank you, I see what is going on. Please, try the following patch.

diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 7cc2c2d..dc7a490 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -2354,12 +2354,12 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_off=
set_t end,
 		if (entry->wired_count =3D=3D 0) {
 			if ((entry->protection & (VM_PROT_READ|VM_PROT_EXECUTE))
 			    =3D=3D 0) {
+				entry->eflags |=3D MAP_ENTRY_WIRE_SKIPPED;
 				if ((flags & VM_MAP_WIRE_HOLESOK) =3D=3D 0) {
 					end =3D entry->end;
 					rv =3D KERN_INVALID_ADDRESS;
 					goto done;
 				}
-				entry->eflags |=3D MAP_ENTRY_WIRE_SKIPPED;
 				goto next_entry;
 			}
 			entry->wired_count++;

--zYtRAvLPyLojxZ7Y
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)

iEYEARECAAYFAkpXQQwACgkQC3+MBN1Mb4jlqwCg9G6iXuhuwrM7CN8Rqhs5qtsa
+K8AoPUFI4GZaH68TylTelb9F3oqG9qw
=YnHT
-----END PGP SIGNATURE-----

--zYtRAvLPyLojxZ7Y--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090710132429.GA55190>