Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Apr 2005 11:35:25 -0700
From:      Maksim Yevmenkin <maksim.yevmenkin@savvis.net>
To:        John-Mark Gurney <gurney_j@resnet.uoregon.edu>
Cc:        Sam Leffler <sam@errno.com>
Subject:   Re: if_tap unaligned access problem
Message-ID:  <42727E6D.5020304@savvis.net>
In-Reply-To: <20050429182819.GP2670@funkthat.com>
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>

next in thread | previous in thread | raw e-mail | index | archive | help
[...]

>>>I could try to port the changes netbsd made using m_copyup and
>>>send you the resulting patchfile. IPv4 has already been serviced by
>>>John-Mark Gurney in perforce. 
>>
>>having these changes in the tree is a good thing, but it will require 
>>more testing. maybe for now we could get away with simpler changes?
> 
> 
>>@@ -1342,12 +1342,15 @@
>> 		total = min(uio->uio_resid, len);
>> 	else
>> 		total = uio->uio_resid;
>>+	if (align >= MHLEN)
>>+		goto nospace;
>> 	if (total > MHLEN)
> 
> 
> Shouldn't this check be total + align > MHLEN?

ops. yes it should, thanks for catching this!

>> 		m_final = m_getcl(how, MT_DATA, M_PKTHDR);
>> 	else
>> 		m_final = m_gethdr(how, MT_DATA);
>> 	if (m_final == NULL)
>> 		goto nospace;
>>+	m_adj(m_final, align);
>> 	m_new = m_final;
>> 	while (progress < total) {
>> 		length = total - progress;

also, there is probably no good reason to call m_adj, we could just 
"m_final->m_data += align" like so

Index: 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
--- uipc_mbuf.c 17 Mar 2005 19:34:57 -0000      1.147
+++ uipc_mbuf.c 29 Apr 2005 18:31:51 -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)
                 m_final = m_getcl(how, MT_DATA, M_PKTHDR);
         else
                 m_final = m_gethdr(how, MT_DATA);
         if (m_final == NULL)
                 goto nospace;
+       m_final->m_data += align;
         m_new = m_final;
         while (progress < total) {
                 length = total - progress;

thanks,
max



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?42727E6D.5020304>