Subject: Re: NMBCLUSTERS again
To: None <6bone@6bone.informatik.uni-leipzig.de>
From: Darren Reed <darrenr@netbsd.org>
List: tech-net
Date: 11/05/2007 02:06:26
This is a multi-part message in MIME format.
--------------090601010602050409060207
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Argh, fat fingers deleted one "{" too many.

Please try the attached and ignore the previous.

Thanks,
Darren

Darren Reed wrote:
> 6bone@6bone.informatik.uni-leipzig.de wrote:
>> Hello Darren,
>>
>> I have applied your patch and rebuilt the kernel. After booting with 
>> the new one I got a kernel trace. You can download it from 
>> http://6bone.informatik.uni-leipzig.de/netbsd/trace.jpg
>
> Can you please reverse out the previous patch and try this one?
>
> I've tested it as far as ifconfig (that produced those panics) and 
> believe
> the logic is much better now.
>
> Thanks,
> Darren
>


--------------090601010602050409060207
Content-Type: text/plain;
 name="ipf.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="ipf.patch"

Index: ip_fil_netbsd.c
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_fil_netbsd.c,v
retrieving revision 2.55.2.56
diff -c -r2.55.2.56 ip_fil_netbsd.c
*** ip_fil_netbsd.c	27 Oct 2007 23:17:26 -0000	2.55.2.56
--- ip_fil_netbsd.c	5 Nov 2007 09:55:11 -0000
***************
*** 1871,1877 ****
  int len;
  {
  	int out = fin->fin_out, dpoff, ipoff;
! 	mb_t *m = xmin;
  	char *ip;
  
  	if (m == NULL)
--- 1875,1881 ----
  int len;
  {
  	int out = fin->fin_out, dpoff, ipoff;
! 	mb_t *m = xmin, *n;
  	char *ip;
  
  	if (m == NULL)
***************
*** 1888,1899 ****
  		dpoff = 0;
  
  	if (M_LEN(m) < len) {
! #ifdef MHLEN
  		/*
  		 * Assume that M_PKTHDR is set and just work with what is left
  		 * rather than check..
  		 * Should not make any real difference, anyway.
  		 */
  		if (len > MHLEN)
  #else
  		if (len > MLEN)
--- 1892,1918 ----
  		dpoff = 0;
  
  	if (M_LEN(m) < len) {
! 		mb_t *ms = m;
! 
! 		n = *fin->fin_mp;
  		/*
  		 * Assume that M_PKTHDR is set and just work with what is left
  		 * rather than check..
  		 * Should not make any real difference, anyway.
  		 */
+ 		if (m != n) {
+ 			/*
+ 			 * Record the mbuf that points to the mbuf that we're
+ 			 * about to go to work on so that we can update the
+ 			 * m_next appropriately later.
+ 			 */
+ 			for (; n->m_next != m; n = n->m_next)
+ 				;
+ 		} else {
+ 			n = NULL;
+ 		}
+ 
+ #ifdef MHLEN
  		if (len > MHLEN)
  #else
  		if (len > MLEN)
***************
*** 1905,1922 ****
  #else
  			FREE_MB_T(*fin->fin_mp);
  			m = NULL;
  #endif
  		} else
  		{
  			m = m_pullup(m, len);
  		}
! 		*fin->fin_mp = m;
  		if (m == NULL) {
  			fin->fin_m = NULL;
  			ATOMIC_INCL(frstats[out].fr_pull[1]);
  			return NULL;
  		}
  
  		while (M_LEN(m) == 0) {
  			m = m->m_next;
  		}
--- 1924,1956 ----
  #else
  			FREE_MB_T(*fin->fin_mp);
  			m = NULL;
+ 			n = NULL;
  #endif
  		} else
  		{
  			m = m_pullup(m, len);
  		}
! 		if ((ms != n) && (n != NULL))
! 			n->m_next = m;
  		if (m == NULL) {
+ 			/*
+ 			 * When n is non-NULL, it indicates that m pointed to
+ 			 * a sub-chain (tail) of the mbuf and that the head
+ 			 * of this chain has not yet been free'd.
+ 			 */
+ 			if ((ms != n) && (n != NULL)) {
+ 				FREE_MB_T(*fin->fin_mp);
+ 			}
+ 
+ 			*fin->fin_mp = NULL;
  			fin->fin_m = NULL;
  			ATOMIC_INCL(frstats[out].fr_pull[1]);
  			return NULL;
  		}
  
+ 		if (ms == n || n == NULL)
+ 			*fin->fin_mp = m;
+ 
  		while (M_LEN(m) == 0) {
  			m = m->m_next;
  		}

--------------090601010602050409060207--