Date: Sun, 3 Dec 2000 20:06:01 +0000 (GMT) From: Terry Lambert <tlambert@primenet.com> To: dg@root.com Cc: gallatin@cs.duke.edu (Andrew Gallatin), bmilekic@technokratis.com (Bosko Milekic), ken@kdm.org (Kenneth D. Merry), arch@FreeBSD.ORG, alfred@FreeBSD.ORG Subject: Re: zero copy code review Message-ID: <200012032006.NAA00585@usr05.primenet.com> In-Reply-To: <200012012326.PAA14154@implode.root.com> from "David Greenman" at Dec 01, 2000 03:26:19 PM
index | next in thread | previous in thread | raw e-mail
> > > In your code, you do deal with the possibility of the MGETHDR
> > > returning NULL (you check for it) and you set ENOBUFS in that case and
> > > jump to the "errorpath" label. But, before using MGETHDR, you allocate an
> > > sf_buf (in sf) and it just so happens that the code beyond "errorpath"
> > > does not take care of freeing the sf_buf you allocated before even
> > > trying to allocate the mbuf.
> >
> >I see your point. This was copied, (bug for bug ;-), from sendfile itself.
> >Look at line 1700 or so of kern/uipc_syscalls.c.. This bug should
> >probaby be fixed there too..
>
> Oops. The original assumption (and code that I wrote) was that M_WAIT
> _cannot_ return a NULL pointer. This was changed in FreeBSD recently, and
> as you mentioned, the code added in rev 1.65 that now checks for it in
> sendfile doesn't do complete cleanup in this case. It definately should
> be fixed so that the sf_buf is freed as well.
There's a real easy fix for this:
m_get_not_broken( flag, type)
int flag, type;
{
struct mbuf *m;
do {
m = m_get( flag, type);
} while( flag == M_WAIT && m == NULL);
return( m);
}
I think the idea that the M_WAIT flag should be broken so that
it can be safely used in interrupt mode is dumb.
Terry Lambert
terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200012032006.NAA00585>
