[csjp@FreeBSD.org: Re: rtfree: 0xffffff00036fb1e0 has 1 refs]

Christian S.J. Peron csjp at FreeBSD.org
Tue Aug 28 11:24:26 PDT 2007


I am not sure who has their hands in the routing code these days so
I figured I would just forward this message off here.  Does the
following look reasonable?


----- Forwarded message from "Christian S.J. Peron" <csjp at FreeBSD.org> -----

From: "Christian S.J. Peron" <csjp at FreeBSD.org>
To: Yuri Pankov <yuri at darklight.org.ru>
Cc: freebsd-current at freebsd.org
Date: Mon, 27 Aug 2007 18:59:03 -0500
Subject: Re: rtfree: 0xffffff00036fb1e0 has 1 refs

Based on some comments in rtfree, we should only be calling rtfree if we
are sure we own the last reference to the route. I am not sure this is the
case in the stf/gif cases... Please try the attached patch and let me know
if there are any ill effects.

On Fri, Aug 24, 2007 at 12:17:26PM +0400, Yuri Pankov wrote:
> Hi,
> 
> I've recently started using he.net's ipv6 tunnel and getting this message:
> rtfree: 0xffffff00036fb1e0 has 1 refs
> 
> I've added kdb_backtrace() in route.c as Gleb Smirnoff suggested before. Here's
> backtrace:
> rtfree: 0xffffff00036fb1e0 has 1 refs
> KDB: stack backtrace:
> db_trace_self_wrapper() at db_trace_self_wrapper+0x2a
> rtfree() at rtfree+0xba
> gif_encapcheck4() at gif_encapcheck4+0x118
> gif_encapcheck() at gif_encapcheck+0xfd
> encap4_input() at encap4_input+0xcc
> ip_input() at ip_input+0xc0
> tunwrite() at tunwrite+0x1d5
> giant_write() at giant_write+0x51
> devfs_write_f() at devfs_write_f+0x9c
> dofilewrite() at dofilewrite+0x85
> kern_writev() at kern_writev+0x4c
> write() at write+0x54
> syscall() at syscall+0x1ce
> Xfast_syscall() at Xfast_syscall+0xab
> --- syscall (4, FreeBSD ELF64, write), rip = 0x80125c35c, rsp = 0x7fffffffda18,
> rbp = 0x60 ---
> 
> 
> ifconfig:
> gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
>         tunnel inet 194.186.18.14 --> 64.71.128.83
>         inet6 fe80::20f:eaff:fe7d:f320%gif0 prefixlen 64 scopeid 0x5 
>         inet6 2001:470:1f03:2d5::2 --> 2001:470:1f03:2d5::1 prefixlen 128 
>         inet6 2001:470:1f01:725::1 prefixlen 64 
> tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
>         inet6 fe80::20f:eaff:fe7d:f320%tun0 prefixlen 64 scopeid 0x6 
>         inet 194.186.18.14 --> 194.186.18.2 netmask 0xffffff00 
>         Opened by PID 458
> 
> 
> Yuri
> _______________________________________________
> freebsd-current at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe at freebsd.org"

-- 
Christian S.J. Peron
csjp at FreeBSD.ORG
FreeBSD Committer

Index: net/if_stf.c
===================================================================
RCS file: /usr/ncvs/src/sys/net/if_stf.c,v
retrieving revision 1.59
diff -u -r1.59 if_stf.c
--- net/if_stf.c	22 Oct 2006 11:52:15 -0000	1.59
+++ net/if_stf.c	27 Aug 2007 23:51:19 -0000
@@ -607,10 +607,10 @@
 			    (u_int32_t)ntohl(sin.sin_addr.s_addr));
 #endif
 			if (rt)
-				rtfree(rt);
+				RTFREE_LOCKED(rt);
 			return -1;
 		}
-		rtfree(rt);
+		RTFREE_LOCKED(rt);
 	}
 
 	return 0;
Index: netinet/in_gif.c
===================================================================
RCS file: /usr/ncvs/src/sys/netinet/in_gif.c,v
retrieving revision 1.36
diff -u -r1.36 in_gif.c
--- netinet/in_gif.c	10 May 2007 15:58:47 -0000	1.36
+++ netinet/in_gif.c	27 Aug 2007 23:48:04 -0000
@@ -374,10 +374,10 @@
 			    (u_int32_t)ntohl(sin.sin_addr.s_addr));
 #endif
 			if (rt)
-				rtfree(rt);
+				RTFREE_LOCKED(rt);
 			return 0;
 		}
-		rtfree(rt);
+		RTFREE_LOCKED(rt);
 	}
 
 	return 32 * 2;

_______________________________________________
freebsd-current at freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscribe at freebsd.org"

----- End forwarded message -----


More information about the freebsd-net mailing list