Hello,
I've been doing some mbuf-related work on my -CURRENT machine lately.
Particularily, I've re-written the allocator and free routines, amongst
other things. However, I've encountered a peculiar problem that surfaces
in ether_output().
What happens is that one of my daemons, for example, natd, or httpd,
etc., performs a system call, which eventually results in a call to
ether_output (following tcp_output, ip_output, etc.). At the bottom of
ether_output(), after an IF_ENQUEUE, and an splx(s), there is the
following check:
if (m->m_flags & M_MCAST)
ifp->if_omcasts++;
The if () part results in a testb $0x2, 0x13(%ebx)
IF I REMEMBER correctly.
For some wierd reason, when the mbuf in question is at a location:
0xstuffF00 (256 bytes into a page, the second mbuf on a page), there is a
page fault. And it's _always_ when the mbuf is at such an address.
Where the wierdness begins is when I actually examine the contents of the
mbuf... I can actually see them, no page fault, no nothing. In fact, if I
`continue' from the debugger, things continue to work fine... until the
next 0xstuffF00 mbuf goes through ether_output() and reaches that check.
If I move the check of the m_flags to just above the splx(s), but after
the IF_ENQUEUE, then the page fault still occurs in the same way, except
that I even get a page fault when trying to examine the contents of the
mbuf. In other words, I can't even `continue' in this case.
If I move the m_flags check before the IF_ENQUEUE, this doesn't happen at
all!
Furthermore, if I revert my mbuf changes, I don't catch this problem.
Anyone got any hints/clues?
Regards,
Bosko.
--
Bosko Milekic * Voice/Mobile: 514.865.7738 * Pager: 514.921.0237
[EMAIL PROTECTED] * http://www.technokratis.com/
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message