On 17.07.2012 12:36, Alexander V. Chernikov wrote:
On 17.07.2012 01:22, Luigi Rizzo wrote:
On Mon, Jul 16, 2012 at 09:43:01PM +0400, Alexander V. Chernikov wrote:
On 06.07.2012 10:11, Luigi Rizzo wrote:
On Thu, Jul 05, 2012 at 05:40:37PM +0400, Alexander V. Chernikov wrote:
On 04.07.2012 19:48, Luigi Rizzo wrote:

well, it seems that the counters are costing some 10% which is
not negligible (60ns per packet according to your test).
Also i'd be curious if you get better savings if you
have actual conflicts on the rulesets (e.g. what happens
with a ruleset that has, say, ten "count ip from any to any" rules) ?

It is a bit difficult to get _exact_ performance numbers since 0.5% of
linerate is ~ 70kpps, however

1.98 MPPS
 >> net.inet.ip.fw.update_counters=1
 >> net.inet.ip.fw.enable=1
1.67 MPPS

.. And here it is time to check ipfw rmlock performance another time,
since we're acquiring recursive rmlock (pfil) and rwlock (ipfw) twice.

Merged r234648 for optimized rmlocks + conversion code attached.

.. No significant improvement:


The same 240kpps loss as in first test.

   2123542     0     0  140309220    2125793     0  191227258     0
   2125316     0     0  140167332    2119988     0  140427764     0
   2121195     0     0  140353100    2126753     0  140264154     0
   1995783 64677     0  137285216    1987194     0  132939934     0
   1929111 170532     0  139248154    1927044     0  127285506     0
   1905240 213804     0  140059092    1906731     0   78969668     0
   1908064 219536     0  140444988    1907710     0  173344532     0
   1906948 218554     0  140365550    1906791     0   79015778     0
   1910961 214023     0  140395374    1911046     0  173126686     0
   1913418 211265     0  140275990    1913272     0  126596628     0

Another try without these changes:

   2141665     0     0  141533920    2143295     0  141662810     0
   2141647     0     0  141536144    2142662     0   89849076     0
   2143523     0     0  113655814    2142859     0   89734352     0
   2024970  1528     0  164095778    2011710     0  241024066     0
   1905563 239180     0  141749498    1909889     0   83090452     0
   1906343 237516     0  141518736    1903779     0  168894600     0
   1907890 235413     0  141558608    1907365     0  126036784     0
...
   1894339  1267     0  125099880    1892903     0  125032806     0
   1885989     0     0  124627036    1894571     0   82456512     0
   1889637     0     0  124735294    1890231     0  167681224     0



--
WBR, Alexander
Index: sys/netinet/ipfw/ip_fw_private.h
===================================================================
--- sys/netinet/ipfw/ip_fw_private.h    (revision 234657)
+++ sys/netinet/ipfw/ip_fw_private.h    (working copy)
@@ -226,7 +226,7 @@ struct ip_fw_chain {
        spinlock_t rwmtx;
        spinlock_t uh_lock;
 #else
-       struct rwlock   rwmtx;
+       struct rmlock   st_lock;        /* chain lock */
        struct rwlock   uh_lock;        /* lock for upper half */
 #endif
        uint32_t        id;             /* ruleset id */
@@ -241,21 +241,21 @@ struct sockopt;   /* used by tcp_var.h */
  */
 
 #define        IPFW_LOCK_INIT(_chain) do {                     \
-       rw_init(&(_chain)->rwmtx, "IPFW static rules"); \
+       rm_init(&(_chain)->st_lock, "IPFW static rules");       \
        rw_init(&(_chain)->uh_lock, "IPFW UH lock");    \
        } while (0)
 
 #define        IPFW_LOCK_DESTROY(_chain) do {                  \
-       rw_destroy(&(_chain)->rwmtx);                   \
+       rm_destroy(&(_chain)->st_lock);                 \
        rw_destroy(&(_chain)->uh_lock);                 \
        } while (0)
 
-#define        IPFW_WLOCK_ASSERT(_chain)       rw_assert(&(_chain)->rwmtx, 
RA_WLOCKED)
+#define        IPFW_WLOCK_ASSERT(_chain)       rm_wowned(&(_chain)->st_lock)
 
-#define IPFW_RLOCK(p) rw_rlock(&(p)->rwmtx)
-#define IPFW_RUNLOCK(p) rw_runlock(&(p)->rwmtx)
-#define IPFW_WLOCK(p) rw_wlock(&(p)->rwmtx)
-#define IPFW_WUNLOCK(p) rw_wunlock(&(p)->rwmtx)
+#define IPFW_RLOCK(p) rm_rlock(&(p)->st_lock, &tracker)
+#define IPFW_RUNLOCK(p) rm_runlock(&(p)->st_lock, &tracker)
+#define IPFW_WLOCK(p) rm_wlock(&(p)->st_lock)
+#define IPFW_WUNLOCK(p) rm_wunlock(&(p)->st_lock)
 
 #define IPFW_UH_RLOCK(p) rw_rlock(&(p)->uh_lock)
 #define IPFW_UH_RUNLOCK(p) rw_runlock(&(p)->uh_lock)
Index: sys/netinet/ipfw/ip_dn_glue.c
===================================================================
--- sys/netinet/ipfw/ip_dn_glue.c       (revision 234657)
+++ sys/netinet/ipfw/ip_dn_glue.c       (working copy)
@@ -42,6 +42,7 @@
 #include <sys/priv.h>
 #include <sys/proc.h>
 #include <sys/rwlock.h>
+#include <sys/rmlock.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/time.h>
Index: sys/netinet/ipfw/ip_fw_log.c
===================================================================
--- sys/netinet/ipfw/ip_fw_log.c        (revision 234657)
+++ sys/netinet/ipfw/ip_fw_log.c        (working copy)
@@ -41,6 +41,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <sys/mbuf.h>
 #include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/rmlock.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
Index: sys/netinet/ipfw/ip_fw_sockopt.c
===================================================================
--- sys/netinet/ipfw/ip_fw_sockopt.c    (revision 234657)
+++ sys/netinet/ipfw/ip_fw_sockopt.c    (working copy)
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/priv.h>
 #include <sys/proc.h>
 #include <sys/rwlock.h>
+#include <sys/rmlock.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/sysctl.h>
@@ -944,6 +945,7 @@ ipfw_ctl(struct sockopt *sopt)
        uint32_t opt;
        char xbuf[128];
        ip_fw3_opheader *op3 = NULL;
+       struct rm_priotracker tracker;  /* rmlock tracker */
 
        error = priv_check(sopt->sopt_td, PRIV_NETINET_IPFW);
        if (error)
Index: sys/netinet/ipfw/ip_fw_nat.c
===================================================================
--- sys/netinet/ipfw/ip_fw_nat.c        (revision 234657)
+++ sys/netinet/ipfw/ip_fw_nat.c        (working copy)
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/lock.h>
 #include <sys/module.h>
 #include <sys/rwlock.h>
+#include <sys/rmlock.h>
 
 #define        IPFW_INTERNAL   /* Access to protected data structures in 
ip_fw.h. */
 
@@ -210,6 +211,7 @@ ipfw_nat(struct ip_fw_args *args, struct cfg_nat *
        int ldt, retval, found;
        struct ip_fw_chain *chain;
        char *c;
+       struct rm_priotracker tracker;  /* rmlock tracker */
 
        ldt = 0;
        retval = 0;
@@ -493,6 +495,7 @@ ipfw_nat_get_cfg(struct sockopt *sopt)
        struct cfg_spool *s;
        char *data;
        int gencnt, nat_cnt, len, error;
+       struct rm_priotracker tracker;  /* rmlock tracker */
 
        nat_cnt = 0;
        len = sizeof(nat_cnt);
@@ -551,6 +554,7 @@ ipfw_nat_get_log(struct sockopt *sopt)
        struct cfg_nat *ptr;
        int i, size;
        struct ip_fw_chain *chain;
+       struct rm_priotracker tracker;  /* rmlock tracker */
 
        chain = &V_layer3_chain;
 
Index: sys/netinet/ipfw/ip_fw_dynamic.c
===================================================================
--- sys/netinet/ipfw/ip_fw_dynamic.c    (revision 234657)
+++ sys/netinet/ipfw/ip_fw_dynamic.c    (working copy)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/mbuf.h>
 #include <sys/kernel.h>
 #include <sys/lock.h>
+#include <sys/rmlock.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
Index: sys/netinet/ipfw/ip_fw_table.c
===================================================================
--- sys/netinet/ipfw/ip_fw_table.c      (revision 234657)
+++ sys/netinet/ipfw/ip_fw_table.c      (working copy)
@@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/lock.h>
 #include <sys/rwlock.h>
+#include <sys/rmlock.h>
 #include <sys/socket.h>
 #include <net/if.h>    /* ip_fw.h requires IFNAMSIZ */
 #include <net/radix.h>
Index: sys/netinet/ipfw/ip_dn_io.c
===================================================================
--- sys/netinet/ipfw/ip_dn_io.c (revision 234657)
+++ sys/netinet/ipfw/ip_dn_io.c (working copy)
@@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/priv.h>
 #include <sys/proc.h>
 #include <sys/rwlock.h>
+#include <sys/rmlock.h>
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <sys/sysctl.h>
Index: sys/netinet/ipfw/ip_fw2.c
===================================================================
--- sys/netinet/ipfw/ip_fw2.c   (revision 234657)
+++ sys/netinet/ipfw/ip_fw2.c   (working copy)
@@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/priv.h>
 #include <sys/proc.h>
 #include <sys/rwlock.h>
+#include <sys/rmlock.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/sysctl.h>
@@ -907,6 +908,7 @@ ipfw_chk(struct ip_fw_args *args)
        int is_ipv4 = 0;
 
        int done = 0;           /* flag to exit the outer loop */
+       struct rm_priotracker tracker;  /* rmlock tracker */
 
        if (m->m_flags & M_SKIP_FIREWALL || (! V_ipfw_vnet_ready))
                return (IP_FW_PASS);    /* accept */
Index: sys/netinet/ipfw/ip_dummynet.c
===================================================================
--- sys/netinet/ipfw/ip_dummynet.c      (revision 234657)
+++ sys/netinet/ipfw/ip_dummynet.c      (working copy)
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/priv.h>
 #include <sys/proc.h>
 #include <sys/rwlock.h>
+#include <sys/rmlock.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/time.h>
Index: sys/netgraph/ng_ipfw.c
===================================================================
--- sys/netgraph/ng_ipfw.c      (revision 234657)
+++ sys/netgraph/ng_ipfw.c      (working copy)
@@ -33,6 +33,7 @@
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/lock.h>
+#include <sys/rmlock.h>
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/ctype.h>
Index: sys/net/if_ethersubr.c
===================================================================
--- sys/net/if_ethersubr.c      (revision 234657)
+++ sys/net/if_ethersubr.c      (working copy)
@@ -41,6 +41,7 @@
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/lock.h>
+#include <sys/rmlock.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
 #include <sys/mbuf.h>
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to