From patchwork Fri Apr 26 07:51:46 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xi Wang X-Patchwork-Id: 239706 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4A4C92C00DD for ; Fri, 26 Apr 2013 17:53:31 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759436Ab3DZHxM (ORCPT ); Fri, 26 Apr 2013 03:53:12 -0400 Received: from mail-qc0-f182.google.com ([209.85.216.182]:57436 "EHLO mail-qc0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759345Ab3DZHwx (ORCPT ); Fri, 26 Apr 2013 03:52:53 -0400 Received: by mail-qc0-f182.google.com with SMTP id k19so2000139qcs.27 for ; Fri, 26 Apr 2013 00:52:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=Z7fONSwM4bNqbd+gOqfr4M5u3gte5H3AOm/3RRTTR7Y=; b=wbFclVmfh7/TjFAmK1BjkKc/pD6B063OItVpbqgjj3o5EhN9QhvPp+VLhcE/DSH+SW ELesmEY3rSeat+amkMDSOhgvbg012Qr3p4XcIwBvTtrSSWhiofEV1GhMV7o+K1uXsIbX YLSigCzJ5bYY6lc8B5pgsqZuXj7YQT+8aeIY1r19HAl3/UvRDz+/zqu7r7mrrYIsN4ak gZYw5nikxO3NAN6pBQfQRCXkKV8wBf79Hk5SuDIgodwOxBzrk13fH7lzypCpBfCZt6M8 LSwtgxtAYxXRKDdN871WnwPzP0CUsyZkWvzGptmJMpQkkdq7acmkDLGaGr7xa8eJY8H/ tt+Q== X-Received: by 10.224.35.137 with SMTP id p9mr39585835qad.74.1366962773013; Fri, 26 Apr 2013 00:52:53 -0700 (PDT) Received: from hchen.csail.mit.edu (hchen.csail.mit.edu. [18.26.5.5]) by mx.google.com with ESMTPSA id h5sm15736932qai.9.2013.04.26.00.52.52 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 26 Apr 2013 00:52:52 -0700 (PDT) From: Xi Wang To: Daniel Borkmann , "David S. Miller" , Russell King , Heiko Carstens , Eric Dumazet , Will Drewry , Andrew Morton Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Xi Wang Subject: [RFC PATCH net-next 6/6] s390/bpf, jit: refactor the BPF JIT interface Date: Fri, 26 Apr 2013 03:51:46 -0400 Message-Id: <1366962706-24204-7-git-send-email-xi.wang@gmail.com> X-Mailer: git-send-email 1.8.1.2 In-Reply-To: <1366962706-24204-1-git-send-email-xi.wang@gmail.com> References: <1366962706-24204-1-git-send-email-xi.wang@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Implement the refactored bpf_jit_compile() and bpf_jit_free(). Signed-off-by: Xi Wang --- arch/s390/net/bpf_jit_comp.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 0972e91..7966e0c 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c @@ -738,19 +738,19 @@ out: return -1; } -void bpf_jit_compile(struct sk_filter *fp) +bpf_func_t bpf_jit_compile(struct sock_filter *filter, unsigned int flen) { unsigned long size, prg_len, lit_len; struct bpf_jit jit, cjit; unsigned int *addrs; int pass, i; + bpf_func_t bpf_func = sk_run_filter; if (!bpf_jit_enable) - return; - addrs = kmalloc(fp->len * sizeof(*addrs), GFP_KERNEL); + return bpf_func; + addrs = kzalloc(flen * sizeof(*addrs), GFP_KERNEL); if (addrs == NULL) - return; - memset(addrs, 0, fp->len * sizeof(*addrs)); + return bpf_func; memset(&jit, 0, sizeof(cjit)); memset(&cjit, 0, sizeof(cjit)); @@ -759,10 +759,10 @@ void bpf_jit_compile(struct sk_filter *fp) jit.lit = jit.mid; bpf_jit_prologue(&jit); - bpf_jit_noleaks(&jit, fp->insns); - for (i = 0; i < fp->len; i++) { - if (bpf_jit_insn(&jit, fp->insns + i, addrs, i, - i == fp->len - 1)) + bpf_jit_noleaks(&jit, filter); + for (i = 0; i < flen; i++) { + if (bpf_jit_insn(&jit, filter + i, addrs, i, + i == flen - 1)) goto out; } bpf_jit_epilogue(&jit); @@ -789,8 +789,8 @@ void bpf_jit_compile(struct sk_filter *fp) cjit = jit; } if (bpf_jit_enable > 1) { - pr_err("flen=%d proglen=%lu pass=%d image=%p\n", - fp->len, jit.end - jit.start, pass, jit.start); + pr_err("flen=%u proglen=%lu pass=%d image=%p\n", + flen, jit.end - jit.start, pass, jit.start); if (jit.start) { printk(KERN_ERR "JIT code:\n"); print_fn_code(jit.start, jit.mid - jit.start); @@ -800,9 +800,10 @@ void bpf_jit_compile(struct sk_filter *fp) } } if (jit.start) - fp->bpf_func = (void *) jit.start; + bpf_func = (void *) jit.start; out: kfree(addrs); + return bpf_func; } static void jit_free_defer(struct work_struct *arg) @@ -813,13 +814,13 @@ static void jit_free_defer(struct work_struct *arg) /* run from softirq, we must use a work_struct to call * module_free() from process context */ -void bpf_jit_free(struct sk_filter *fp) +void bpf_jit_free(bpf_func_t bpf_func) { struct work_struct *work; - if (fp->bpf_func == sk_run_filter) + if (bpf_func == sk_run_filter) return; - work = (struct work_struct *)fp->bpf_func; + work = (struct work_struct *)bpf_func; INIT_WORK(work, jit_free_defer); schedule_work(work); }