svn commit: r184773 - user/kmacy/HEAD_fast_multi_xmit/sys/net

Kip Macy kmacy at FreeBSD.org
Sat Nov 8 16:00:56 PST 2008


Author: kmacy
Date: Sun Nov  9 00:00:56 2008
New Revision: 184773
URL: http://svn.freebsd.org/changeset/base/184773

Log:
  rt and hash fields can't safely be held in registers across critical sections

Modified:
  user/kmacy/HEAD_fast_multi_xmit/sys/net/flowtable.c

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/flowtable.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/flowtable.c	Sat Nov  8 23:26:24 2008	(r184772)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/flowtable.c	Sun Nov  9 00:00:56 2008	(r184773)
@@ -220,12 +220,12 @@ union ipv6_flow {
 };
 
 struct flentry {
-	uint32_t	f_fhash;	/* hash flowing forward */
+	volatile uint32_t	f_fhash;/* hash flowing forward */
 	uint16_t	f_flags;	/* flow flags */
 	uint8_t		f_pad;
 	uint8_t		f_proto;	/* protocol */
 	time_t		f_uptime;	/* last time this flow was accessed */
-	struct rtentry *f_rt;		/* rtentry for flow */
+	volatile struct rtentry *f_rt;	/* rtentry for flow */
 	u_char		f_desten[ETHER_ADDR_LEN];	
 };
 
@@ -464,7 +464,6 @@ flow_stale(struct flowtable *ft, struct 
 	time_t idle_time;
 
 	if ((fle->f_fhash == 0)
-	    || (fle->f_rt == NULL)
 	    || ((fle->f_rt->rt_flags & RTF_UP) == 0)
 	    || (fle->f_uptime <= fle->f_rt->rt_llinfo_uptime)
 	    || ((fle->f_rt->rt_flags & RTF_GATEWAY) &&
@@ -512,7 +511,8 @@ flowtable_insert(struct flowtable *ft, u
     uint8_t proto, struct rtentry *rt, u_char *desten, uint16_t flags)
 {
 	struct flentry *fle;
-	struct rtentry *rt0 = NULL;
+	volatile struct rtentry *rt0 = NULL;
+	struct rtentry *rt1;
 	int stale;
 	bitstr_t *mask;
 	
@@ -530,8 +530,9 @@ retry:	
 		FL_ENTRY_UNLOCK(ft, hash);
 		if (!stale)
 			return (ENOSPC);
-		if (rt0)
-			RTFREE(rt0);
+
+		rt1 = __DEVOLATILE(struct rtentry *, rt0);
+		RTFREE(rt1);
 		/*
 		 * We might end up on a different cpu
 		 */
@@ -614,7 +615,8 @@ flowtable_lookup(struct flowtable *ft, s
 	struct route ro;
 	int cache = 1, error = 0;
 	u_char desten[ETHER_ADDR_LEN];
-
+	volatile struct rtentry *rt;
+	
 	flags = ft ? ft->ft_flags : 0;
 	ro.ro_rt = NULL;
 	
@@ -639,16 +641,17 @@ flowtable_lookup(struct flowtable *ft, s
 	}
 	FL_ENTRY_LOCK(ft, hash);
 	fle = FL_ENTRY(ft, hash);
+	rt = fle->f_rt;
 	if (fle->f_fhash == hash
 	    && flowtable_key_equal(fle, key, flags)
 	    && (proto == fle->f_proto)
-	    && (fle->f_rt->rt_flags & RTF_UP)
-	    && (fle->f_uptime > fle->f_rt->rt_llinfo_uptime)
+	    && (rt->rt_flags & RTF_UP)
+	    && (fle->f_uptime > rt->rt_llinfo_uptime)
 	    && gw_valid(fle)) {
 		fle->f_uptime = time_uptime;
 		fle->f_flags |= flags;
-		fle->f_rt->rt_rmx.rmx_pksent++;
-		ro.ro_rt = fle->f_rt;
+		rt->rt_rmx.rmx_pksent++;
+		ro.ro_rt = __DEVOLATILE(struct rtentry *, rt);
 		route_to_rtentry_info(&ro, fle->f_desten, ri);
 		FL_ENTRY_UNLOCK(ft, hash);
 		return (0);
@@ -695,7 +698,7 @@ uncached:
 		
 #endif
 		route_to_rtentry_info(&ro, error ? NULL : desten, ri);
-
+		ro.ro_rt->rt_rmx.rmx_pksent++;
 		if (error == 0 && cache) {
 			error = flowtable_insert(ft, hash, key, proto,
 			    ro.ro_rt, desten, flags);


More information about the svn-src-user mailing list