Author: andre
Date: Sun Oct 28 18:07:34 2012
New Revision: 242254
URL: http://svn.freebsd.org/changeset/base/242254

Log:
  Change the syncache count reporting the current number of entries
  from an unprotected u_int that reports garbage on SMP to a function
  based sysctl obtaining the current value from UMA.
  
  Also read back the actual cache_limit after page size rounding by UMA.
  
  PR:           kern/165879
  MFC after:    2 weeks

Modified:
  head/sys/netinet/tcp_syncache.c
  head/sys/netinet/tcp_syncache.h

Modified: head/sys/netinet/tcp_syncache.c
==============================================================================
--- head/sys/netinet/tcp_syncache.c     Sun Oct 28 17:59:46 2012        
(r242253)
+++ head/sys/netinet/tcp_syncache.c     Sun Oct 28 18:07:34 2012        
(r242254)
@@ -123,6 +123,7 @@ struct syncache *syncache_lookup(struct 
 static int      syncache_respond(struct syncache *);
 static struct   socket *syncache_socket(struct syncache *, struct socket *,
                    struct mbuf *m);
+static int      syncache_sysctl_count(SYSCTL_HANDLER_ARGS);
 static void     syncache_timeout(struct syncache *sc, struct syncache_head 
*sch,
                    int docallout);
 static void     syncache_timer(void *);
@@ -158,8 +159,8 @@ SYSCTL_VNET_UINT(_net_inet_tcp_syncache,
     &VNET_NAME(tcp_syncache.cache_limit), 0,
     "Overall entry limit for syncache");
 
-SYSCTL_VNET_UINT(_net_inet_tcp_syncache, OID_AUTO, count, CTLFLAG_RD,
-    &VNET_NAME(tcp_syncache.cache_count), 0,
+SYSCTL_VNET_PROC(_net_inet_tcp_syncache, OID_AUTO, count, 
(CTLTYPE_UINT|CTLFLAG_RD),
+    NULL, 0, &syncache_sysctl_count, "IU",
     "Current number of entries in syncache");
 
 SYSCTL_VNET_UINT(_net_inet_tcp_syncache, OID_AUTO, hashsize, CTLFLAG_RDTUN,
@@ -225,7 +226,6 @@ syncache_init(void)
 {
        int i;
 
-       V_tcp_syncache.cache_count = 0;
        V_tcp_syncache.hashsize = TCP_SYNCACHE_HASHSIZE;
        V_tcp_syncache.bucket_limit = TCP_SYNCACHE_BUCKETLIMIT;
        V_tcp_syncache.rexmt_limit = SYNCACHE_MAXREXMTS;
@@ -269,6 +269,7 @@ syncache_init(void)
        V_tcp_syncache.zone = uma_zcreate("syncache", sizeof(struct syncache),
            NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
        uma_zone_set_max(V_tcp_syncache.zone, V_tcp_syncache.cache_limit);
+       V_tcp_syncache.cache_limit = uma_zone_get_max(V_tcp_syncache.zone);
 }
 
 #ifdef VIMAGE
@@ -296,8 +297,8 @@ syncache_destroy(void)
                mtx_destroy(&sch->sch_mtx);
        }
 
-       KASSERT(V_tcp_syncache.cache_count == 0, ("%s: cache_count %d not 0",
-           __func__, V_tcp_syncache.cache_count));
+       KASSERT(uma_zone_get_cur(V_tcp_syncache.zone) == 0,
+           ("%s: cache_count not 0", __func__));
 
        /* Free the allocated global resources. */
        uma_zdestroy(V_tcp_syncache.zone);
@@ -305,6 +306,15 @@ syncache_destroy(void)
 }
 #endif
 
+static int
+syncache_sysctl_count(SYSCTL_HANDLER_ARGS)
+{
+       int count;
+
+       count = uma_zone_get_cur(V_tcp_syncache.zone);
+       return (sysctl_handle_int(oidp, &count, sizeof(count), req));
+}
+
 /*
  * Inserts a syncache entry into the specified bucket row.
  * Locks and unlocks the syncache_head autonomously.
@@ -347,7 +357,6 @@ syncache_insert(struct syncache *sc, str
 
        SCH_UNLOCK(sch);
 
-       V_tcp_syncache.cache_count++;
        TCPSTAT_INC(tcps_sc_added);
 }
 
@@ -373,7 +382,6 @@ syncache_drop(struct syncache *sc, struc
 #endif
 
        syncache_free(sc);
-       V_tcp_syncache.cache_count--;
 }
 
 /*
@@ -958,7 +966,6 @@ syncache_expand(struct in_conninfo *inc,
                        tod->tod_syncache_removed(tod, sc->sc_todctx);
                }
 #endif
-               V_tcp_syncache.cache_count--;
                SCH_UNLOCK(sch);
        }
 

Modified: head/sys/netinet/tcp_syncache.h
==============================================================================
--- head/sys/netinet/tcp_syncache.h     Sun Oct 28 17:59:46 2012        
(r242253)
+++ head/sys/netinet/tcp_syncache.h     Sun Oct 28 18:07:34 2012        
(r242254)
@@ -112,7 +112,6 @@ struct tcp_syncache {
        u_int   hashsize;
        u_int   hashmask;
        u_int   bucket_limit;
-       u_int   cache_count;            /* XXX: unprotected */
        u_int   cache_limit;
        u_int   rexmt_limit;
        u_int   hash_secret;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to