Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-2.6-block.git] / arch / sparc / net / bpf_jit_comp.c
index 51ae87b483e0ec5884bb0bae14a2740f5674277e..7c06f18150abf5e3431b1743a8d816ae71d2f9a3 100644 (file)
@@ -585,16 +585,11 @@ void bpf_jit_compile(struct bpf_prog *fp)
                        case BPF_ANC | SKF_AD_PROTOCOL:
                                emit_skb_load16(protocol, r_A);
                                break;
-#if 0
-                               /* GCC won't let us take the address of
-                                * a bit field even though we very much
-                                * know what we are doing here.
-                                */
                        case BPF_ANC | SKF_AD_PKTTYPE:
-                               __emit_skb_load8(pkt_type, r_A);
+                               __emit_skb_load8(__pkt_type_offset, r_A);
+                               emit_andi(r_A, PKT_TYPE_MAX, r_A);
                                emit_alu_K(SRL, 5);
                                break;
-#endif
                        case BPF_ANC | SKF_AD_IFINDEX:
                                emit_skb_loadptr(dev, r_A);
                                emit_cmpi(r_A, 0);
@@ -812,7 +807,7 @@ cond_branch:                        f_offset = addrs[i + filter[i].jf];
        if (image) {
                bpf_flush_icache(image, image + proglen);
                fp->bpf_func = (void *)image;
-               fp->jited = 1;
+               fp->jited = true;
        }
 out:
        kfree(addrs);
@@ -823,5 +818,6 @@ void bpf_jit_free(struct bpf_prog *fp)
 {
        if (fp->jited)
                module_free(NULL, fp->bpf_func);
-       kfree(fp);
+
+       bpf_prog_unlock_free(fp);
 }