From patchwork Wed Apr 23 20:57:01 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Borkmann X-Patchwork-Id: 341993 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 172DF14011D for ; Thu, 24 Apr 2014 06:57:50 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932671AbaDWU5g (ORCPT ); Wed, 23 Apr 2014 16:57:36 -0400 Received: from mx1.redhat.com ([209.132.183.28]:16268 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932651AbaDWU5a (ORCPT ); Wed, 23 Apr 2014 16:57:30 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3NKvSdA025839 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 23 Apr 2014 16:57:28 -0400 Received: from localhost (vpn1-4-129.ams2.redhat.com [10.36.4.129]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3NKvREj010461; Wed, 23 Apr 2014 16:57:27 -0400 From: Daniel Borkmann To: davem@davemloft.net Cc: ast@plumgrid.com, netdev@vger.kernel.org Subject: [PATCH net-next 5/5] net: filter: optimize BPF migration for ARG1/CTX handling Date: Wed, 23 Apr 2014 22:57:01 +0200 Message-Id: <1398286621-3591-6-git-send-email-dborkman@redhat.com> In-Reply-To: <1398286621-3591-1-git-send-email-dborkman@redhat.com> References: <1398286621-3591-1-git-send-email-dborkman@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Currently, at initial setup in __sk_run_filter() we initialize the BPF stack's frame-pointer and CTX register. However, instead of the CTX register, we initialize context to ARG1, and during user filter migration we emit *always* an instruction that copies the content from ARG1 to CTX. ARG1 is needed in BPF_CALL instructions to setup ctx, A, X for call emission. However, we nevertheless copy CTX over to ARG1 in these cases. So all in all, we always emit one instruction at BPF program beginning that should have actually been avoided to spare this overhead. Signed-off-by: Daniel Borkmann Cc: Alexei Starovoitov --- net/core/filter.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/net/core/filter.c b/net/core/filter.c index eada3d5..6fed231 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -62,7 +62,6 @@ #define A regs[insn->a_reg] #define X regs[insn->x_reg] #define FP regs[BPF_REG_FP] -#define ARG1 regs[BPF_REG_ARG1] #define CTX regs[BPF_REG_CTX] #define K insn->imm @@ -257,7 +256,7 @@ unsigned int __sk_run_filter(void *ctx, const struct sock_filter_int *insn) #define CONT_JMP ({ insn++; goto select_insn; }) FP = (u64) (unsigned long) &stack[ARRAY_SIZE(stack)]; - ARG1 = (u64) (unsigned long) ctx; + CTX = (u64) (unsigned long) ctx; /* Register for user BPF programs need to be reset first. */ regs[BPF_REG_A] = 0; @@ -896,13 +895,6 @@ do_pass: new_insn = new_prog; fp = prog; - if (new_insn) { - new_insn->code = BPF_ALU64 | BPF_MOV | BPF_X; - new_insn->a_reg = BPF_REG_CTX; - new_insn->x_reg = BPF_REG_ARG1; - } - new_insn++; - for (i = 0; i < len; fp++, i++) { struct sock_filter_int tmp_insns[6] = { }; struct sock_filter_int *insn = tmp_insns;