Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
[cascardo/linux.git] / arch / s390 / net / bpf_jit_comp.c
index 708d60e..9c36dc3 100644 (file)
@@ -737,10 +737,10 @@ call_fn:  /* lg %r1,<d(function)>(%r13) */
                /* icm  %r5,3,<d(type)>(%r1) */
                EMIT4_DISP(0xbf531000, offsetof(struct net_device, type));
                break;
-       case BPF_S_ANC_RXHASH: /* A = skb->rxhash */
-               BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, rxhash) != 4);
-               /* l %r5,<d(rxhash)>(%r2) */
-               EMIT4_DISP(0x58502000, offsetof(struct sk_buff, rxhash));
+       case BPF_S_ANC_RXHASH: /* A = skb->hash */
+               BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4);
+               /* l %r5,<d(hash)>(%r2) */
+               EMIT4_DISP(0x58502000, offsetof(struct sk_buff, hash));
                break;
        case BPF_S_ANC_VLAN_TAG:
        case BPF_S_ANC_VLAN_TAG_PRESENT:
@@ -877,6 +877,7 @@ void bpf_jit_compile(struct sk_filter *fp)
        if (jit.start) {
                set_memory_ro((unsigned long)header, header->pages);
                fp->bpf_func = (void *) jit.start;
+               fp->jited = 1;
        }
 out:
        kfree(addrs);
@@ -887,10 +888,12 @@ void bpf_jit_free(struct sk_filter *fp)
        unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK;
        struct bpf_binary_header *header = (void *)addr;
 
-       if (fp->bpf_func == sk_run_filter)
+       if (!fp->jited)
                goto free_filter;
+
        set_memory_rw(addr, header->pages);
        module_free(NULL, header);
+
 free_filter:
        kfree(fp);
 }