Date: Mon, 2 May 2005 11:09:10 -0700 From: John-Mark Gurney <gurney_j@resnet.uoregon.edu> To: Maksim Yevmenkin <maksim.yevmenkin@savvis.net> Cc: net@freebsd.org Subject: Re: if_tap unaligned access problem Message-ID: <20050502180910.GV2670@funkthat.com> In-Reply-To: <42765799.6090201@savvis.net> References: <20050428135120.GB21428@cell.sick.ru> <427111BF.2050607@savvis.net> <42712BAA.4070201@elischer.org> <42715269.3010306@errno.com> <Pine.SOC.4.61.0504291132520.28551@tea.blinkenlights.nl> <4272743A.2030003@savvis.net> <20050429182819.GP2670@funkthat.com> <42765799.6090201@savvis.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Maksim Yevmenkin wrote this message on Mon, May 02, 2005 at 09:38 -0700: > >>>>>>i think we have few options here: > >>>>>> > >>>>>>1) revert back original tapwrite function that was changed in v. > >>>>>>1.48 and set offset to 2 bytes in top mbuf > >>>>>> > >>>>>>2) change current version of tapwrite so it would m_prepend and > >>>>>>m_pullup mbuf after m_uiotombuf > >>>>>> > >>>>>>3) change m_uiotombuf to accept one more parameter - mbuf offset at > >>>>>>which data should be copied. there are not that many users of > >>>>>>m_uiotombuf > >> > >>please find and review the attached patch (untested) that implements > >>option (3) above. > > any objections to the attached (revised) patch? can i commit it? > > thanks, > max > Index: sys/kern/uipc_mbuf.c > =================================================================== > RCS file: /home/ncvs/src/sys/kern/uipc_mbuf.c,v > retrieving revision 1.147 > diff -u -r1.147 uipc_mbuf.c > --- sys/kern/uipc_mbuf.c 17 Mar 2005 19:34:57 -0000 1.147 > +++ sys/kern/uipc_mbuf.c 2 May 2005 16:33:41 -0000 > @@ -1333,7 +1333,7 @@ > #endif > > struct mbuf * > -m_uiotombuf(struct uio *uio, int how, int len) > +m_uiotombuf(struct uio *uio, int how, int len, int align) > { > struct mbuf *m_new = NULL, *m_final = NULL; > int progress = 0, error = 0, length, total; > @@ -1342,12 +1342,15 @@ > total = min(uio->uio_resid, len); > else > total = uio->uio_resid; > - if (total > MHLEN) > + if (align >= MHLEN) > + goto nospace; > + if (total + align > MHLEN) I kinda noticed this a bit ago, but didn't think much of it till now... do we want to allow align >= MHLEN if total requires a cluster? since if we use a cluster, we'd have enough space for a larger align... -- John-Mark Gurney Voice: +1 415 225 5579 "All that I will do, has been done, All that I have, has not."
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050502180910.GV2670>