sosend() and mbuf

Dag-Erling Smørgrav des at des.no
Tue Aug 4 16:36:50 UTC 2009


Maslan <maslanbsd at gmail.com> writes:
> Fatal trap 12: page fault while in kernel mode
> cpuid = 1; apic id = 01
> fault virtual address	= 0x10
> fault code		= supervisor read, page not present
> instruction pointer	= 0x20:0xc085935b
> [...]
> #7  0xc085935b in namei (ndp=0xe6cd3bc8) at /usr/src/sys/kern/vfs_lookup.c:191
> #8  0xc08706d7 in vn_open_cred (ndp=0xe6cd3bc8, flagp=0xe6cd3cc4, cmode=1,
>     cred=0xc408fc00, fp=0xc4b5b344) at /usr/src/sys/kern/vfs_vnops.c:188
> #9  0xc08709a3 in vn_open (ndp=0xe6cd3bc8, flagp=0xe6cd3cc4, cmode=1,
>     fp=0xc4b5b344) at /usr/src/sys/kern/vfs_vnops.c:94
> #10 0xc086e0d3 in kern_open (td=0xc499dd20, path=0xc4c7a978 "/root/test.txt",
>     pathseg=UIO_SYSSPACE, flags=1, mode=1)
>     at /usr/src/sys/kern/vfs_syscalls.c:1042
> #11 0xc4c7a805 in f_open () from ./test.ko
> #12 0xc4c7a8a1 in thread_main () from ./test.ko
> #13 0xc07bd079 in fork_exit (callout=0xc4c7a880 <thread_main>, arg=0x0,
>     frame=0xe6cd3d38) at /usr/src/sys/kern/kern_fork.c:810
> #14 0xc0ac92b0 in fork_trampoline () at /usr/src/sys/i386/i386/exception.s:264

Depending on the exact FreeBSD version you're working on, line 191 in
sys/kern/vfs_lookup.c is either

   188          /*
   189           * Get starting point for the translation.
   190           */
 * 191          FILEDESC_SLOCK(fdp);
   192          ndp->ni_rootdir = fdp->fd_rdir;
   193          ndp->ni_topdir = fdp->fd_jdir;

or

   187          /*
   188           * Get starting point for the translation.
   189           */
   190          FILEDESC_SLOCK(fdp);
 * 191          ndp->ni_rootdir = fdp->fd_rdir;
   192          ndp->ni_topdir = fdp->fd_jdir;

Either way, the problem is not ndp (which we know is valid), but fdp,
which is dereferenced either by FILEDESC_SLOCK(), which evaluates to
sx_slock(&fdp->fd_sx), or in the assignment.

You're calling namei() (indirectly) from a thread assigned to proc0, and
I'm pretty sure proc0 has a valid filedesc table (see proc0_init() in
sys/kern/init_main.c), but all the same, I suspect that creating a
separate process as I suggested earlier will fix the panic.

DES
-- 
Dag-Erling Smørgrav - des at des.no


More information about the freebsd-hackers mailing list