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
next in thread | previous in thread | raw e-mail | index | archive | help
> > > 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200012032006.NAA00585>