Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net/npf Always use BPF JIT for NPF rules (using BPF code...



details:   https://anonhg.NetBSD.org/src/rev/737c06d6e42c
branches:  trunk
changeset: 785531:737c06d6e42c
user:      rmind <rmind%NetBSD.org@localhost>
date:      Mon Mar 18 02:24:45 2013 +0000

description:
Always use BPF JIT for NPF rules (using BPF code) if it is available.

diffstat:

 sys/net/npf/npf_ruleset.c |  33 ++++++++++++++++++++++++++++-----
 1 files changed, 28 insertions(+), 5 deletions(-)

diffs (91 lines):

diff -r c9862ab5e4cb -r 737c06d6e42c sys/net/npf/npf_ruleset.c
--- a/sys/net/npf/npf_ruleset.c Mon Mar 18 02:17:49 2013 +0000
+++ b/sys/net/npf/npf_ruleset.c Mon Mar 18 02:24:45 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: npf_ruleset.c,v 1.19 2013/02/16 21:11:13 rmind Exp $   */
+/*     $NetBSD: npf_ruleset.c,v 1.20 2013/03/18 02:24:45 rmind Exp $   */
 
 /*-
  * Copyright (c) 2009-2013 The NetBSD Foundation, Inc.
@@ -34,17 +34,19 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_ruleset.c,v 1.19 2013/02/16 21:11:13 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_ruleset.c,v 1.20 2013/03/18 02:24:45 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
 
+#include <sys/atomic.h>
 #include <sys/kmem.h>
 #include <sys/queue.h>
 #include <sys/mbuf.h>
 #include <sys/types.h>
 
 #include <net/bpf.h>
+#include <net/bpfjit.h>
 #include <net/pfil.h>
 #include <net/if.h>
 
@@ -80,6 +82,7 @@
 
        /* Code to process, if any. */
        int                     r_type;
+       bpfjit_function_t       r_jcode;
        void *                  r_code;
        size_t                  r_clen;
 
@@ -535,11 +538,18 @@
 /*
  * npf_rule_setcode: assign filter code to the rule.
  *
- * => The code should be validated by the caller.
+ * => The code must be validated by the caller.
+ * => JIT compilation may be performed here.
  */
 void
 npf_rule_setcode(npf_rule_t *rl, const int type, void *code, size_t size)
 {
+       /* Perform BPF JIT if possible. */
+       if (type == NPF_CODE_BPF && (membar_consumer(),
+           bpfjit_module_ops.bj_generate_code != NULL)) {
+               KASSERT(rl->r_jcode == NULL);
+               rl->r_jcode = bpfjit_module_ops.bj_generate_code(code, size);
+       }
        rl->r_type = type;
        rl->r_code = code;
        rl->r_clen = size;
@@ -573,9 +583,14 @@
                npf_rproc_release(rp);
        }
        if (rl->r_code) {
-               /* Free n-code. */
+               /* Free byte-code. */
                kmem_free(rl->r_code, rl->r_clen);
        }
+       if (rl->r_jcode) {
+               /* Free JIT code. */
+               KASSERT(bpfjit_module_ops.bj_free_code != NULL);
+               bpfjit_module_ops.bj_free_code(rl->r_jcode);
+       }
        if (rl->r_dict) {
                /* Destroy the dictionary. */
                prop_object_release(rl->r_dict);
@@ -647,7 +662,15 @@
                        return false;
        }
 
-       /* Execute the code, if any. */
+       /* Execute JIT code, if any. */
+       if (__predict_true(rl->r_jcode)) {
+               struct mbuf *m = nbuf_head_mbuf(nbuf);
+               size_t pktlen = m_length(m);
+
+               return rl->r_jcode((unsigned char *)m, pktlen, 0) != 0;
+       }
+
+       /* Execute the byte-code, if any. */
        if ((code = rl->r_code) == NULL) {
                return true;
        }



Home | Main Index | Thread Index | Old Index