Author: adrian
Date: Fri Feb 14 00:05:09 2014
New Revision: 261859
URL: http://svnweb.freebsd.org/changeset/base/261859

Log:
  Don't insert a flowtable entry if the lle isn't yet valid.
  
  Some of the collisions that are occuring are due to flowtable lookups
  that succeed but have an invalid lle - typically because the L2 adjacency
  lookup hasn't completed.  This would lead to a follow-up insert which
  would then fail (ie, collision) and the code would fall through to doing
  a slow-path L2/L3 lookup in the netinet/netinet6 code.
  
  This patch simply aborts storing a new flowtable entry if the lle isn't
  yet valid.
  
  Whilst I'm here, add a new pcpu counter for the item so the number of
  failures can be tracked separately from generic "collisions."
  
  Reviewed by:  glebius
  MFC after:    10 days
  Sponsored by: Netflix, Inc.

Modified:
  head/sys/net/flowtable.c
  head/sys/net/flowtable.h
  head/usr.bin/netstat/flowtable.c

Modified: head/sys/net/flowtable.c
==============================================================================
--- head/sys/net/flowtable.c    Thu Feb 13 22:24:36 2014        (r261858)
+++ head/sys/net/flowtable.c    Fri Feb 14 00:05:09 2014        (r261859)
@@ -966,6 +966,15 @@ flowtable_lookup_common(struct flowtable
                RTFREE(rt);
                return (NULL);
        }
+
+       /* Don't insert the entry if the ARP hasn't yet finished resolving */
+       if ((lle->la_flags & LLE_VALID) == 0) {
+               RTFREE(rt);
+               LLE_FREE(lle);
+               FLOWSTAT_INC(ft, ft_fail_lle_invalid);
+               return (NULL);
+       }
+
        ro->ro_lle = lle;
 
        if (flowtable_insert(ft, hash, key, fibnum, ro, flags) != 0) {

Modified: head/sys/net/flowtable.h
==============================================================================
--- head/sys/net/flowtable.h    Thu Feb 13 22:24:36 2014        (r261858)
+++ head/sys/net/flowtable.h    Fri Feb 14 00:05:09 2014        (r261859)
@@ -39,6 +39,7 @@ struct flowtable_stat {
        uint64_t        ft_frees;
        uint64_t        ft_hits;
        uint64_t        ft_lookups;
+       uint64_t        ft_fail_lle_invalid;
 };
 
 #ifdef _KERNEL

Modified: head/usr.bin/netstat/flowtable.c
==============================================================================
--- head/usr.bin/netstat/flowtable.c    Thu Feb 13 22:24:36 2014        
(r261858)
+++ head/usr.bin/netstat/flowtable.c    Fri Feb 14 00:05:09 2014        
(r261859)
@@ -55,6 +55,7 @@ print_stats(struct flowtable_stat *stat)
        p(ft_collisions, "\t%ju collision%s\n");
        p(ft_free_checks, "\t%ju free check%s\n");
        p(ft_frees, "\t%ju free%s\n");
+       p(ft_fail_lle_invalid, "\t%ju lookups w/ no resolved ARP%s\n");
 
 #undef p2
 #undef p
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to