From patchwork Thu Oct 30 06:12:15 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Kirjanov X-Patchwork-Id: 404891 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 43EDC14007B for ; Thu, 30 Oct 2014 17:39:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758306AbaJ3Gjn (ORCPT ); Thu, 30 Oct 2014 02:39:43 -0400 Received: from mail-la0-f46.google.com ([209.85.215.46]:64916 "EHLO mail-la0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758299AbaJ3Gjl (ORCPT ); Thu, 30 Oct 2014 02:39:41 -0400 Received: by mail-la0-f46.google.com with SMTP id hs14so3834164lab.19 for ; Wed, 29 Oct 2014 23:39:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Dp1IsEw2+FmIU7cl6H+5wpVbn9b3t7lul6YEvfLh8mI=; b=mcbzG0M1ToypolKB7AUU5kwxEHIYiXWJ3LTcatD0TkvFHQStzX++5nuW/0j0byQhBZ 821dxmSAvhP16jBRWjupdPBDpghXj93S2Wk8EQrZmHyN38PJeQdSncIMmJT5s2qKvPwb 4atiZ1MDaZJk6SIPKJuisDDbcqEIx5eQJNm6aDlQ6njXDw8YAypWUc4GWS24CndeDe2S EKSHPVlNPcYq/kVg236pejhlTtId8mFxlB0cbs0pf5eF8Uo7omssOjj9lnUC16F1ackC aYeA4FHu88Az4bUs8LnOmkYzIT7bEV1Iowr5OBLSQmKKqt55zHhchnjYQPBe3NydcxFT x6zA== X-Gm-Message-State: ALoCoQkXqHSwq22i0b9YnHYsSc0BR4VejMfDc6kev/t5YdknY97Wpb65cEgdXZiv02UY/KB/A5zQ X-Received: by 10.112.62.133 with SMTP id y5mr16758152lbr.53.1414651179861; Wed, 29 Oct 2014 23:39:39 -0700 (PDT) Received: from hydra.kdaintranet ([87.228.41.15]) by mx.google.com with ESMTPSA id q7sm2827176laq.32.2014.10.29.23.39.38 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 29 Oct 2014 23:39:38 -0700 (PDT) From: Denis Kirjanov To: netdev@vger.kernel.org Cc: linuxppc-dev@ozlabs.org, Denis Kirjanov , Alexei Starovoitov , Michael Ellerman , Matt Evans Subject: [PATCH v2] PPC: bpf_jit_comp: add SKF_AD_PKTTYPE instruction Date: Thu, 30 Oct 2014 09:12:15 +0300 Message-Id: <1414649535-3956-1-git-send-email-kda@linux-powerpc.org> X-Mailer: git-send-email 2.1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add BPF extension SKF_AD_PKTTYPE to ppc JIT to load skb->pkt_type field. Before: [ 88.262622] test_bpf: #11 LD_IND_NET 86 97 99 PASS [ 88.265740] test_bpf: #12 LD_PKTTYPE 109 107 PASS After: [ 80.605964] test_bpf: #11 LD_IND_NET 44 40 39 PASS [ 80.607370] test_bpf: #12 LD_PKTTYPE 9 9 PASS CC: Alexei Starovoitov CC: Michael Ellerman Cc: Matt Evans Signed-off-by: Denis Kirjanov v2: Added test rusults --- arch/powerpc/include/asm/ppc-opcode.h | 1 + arch/powerpc/net/bpf_jit.h | 7 +++++++ arch/powerpc/net/bpf_jit_comp.c | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h index 6f85362..1a52877 100644 --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h @@ -204,6 +204,7 @@ #define PPC_INST_ERATSX_DOT 0x7c000127 /* Misc instructions for BPF compiler */ +#define PPC_INST_LBZ 0x88000000 #define PPC_INST_LD 0xe8000000 #define PPC_INST_LHZ 0xa0000000 #define PPC_INST_LHBRX 0x7c00062c diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h index 9aee27c..c406aa9 100644 --- a/arch/powerpc/net/bpf_jit.h +++ b/arch/powerpc/net/bpf_jit.h @@ -87,6 +87,9 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh); #define PPC_STD(r, base, i) EMIT(PPC_INST_STD | ___PPC_RS(r) | \ ___PPC_RA(base) | ((i) & 0xfffc)) + +#define PPC_LBZ(r, base, i) EMIT(PPC_INST_LBZ | ___PPC_RT(r) | \ + ___PPC_RA(base) | IMM_L(i)) #define PPC_LD(r, base, i) EMIT(PPC_INST_LD | ___PPC_RT(r) | \ ___PPC_RA(base) | IMM_L(i)) #define PPC_LWZ(r, base, i) EMIT(PPC_INST_LWZ | ___PPC_RT(r) | \ @@ -96,6 +99,10 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh); #define PPC_LHBRX(r, base, b) EMIT(PPC_INST_LHBRX | ___PPC_RT(r) | \ ___PPC_RA(base) | ___PPC_RB(b)) /* Convenience helpers for the above with 'far' offsets: */ +#define PPC_LBZ_OFFS(r, base, i) do { if ((i) < 32768) PPC_LBZ(r, base, i); \ + else { PPC_ADDIS(r, base, IMM_HA(i)); \ + PPC_LBZ(r, r, IMM_L(i)); } } while(0) + #define PPC_LD_OFFS(r, base, i) do { if ((i) < 32768) PPC_LD(r, base, i); \ else { PPC_ADDIS(r, base, IMM_HA(i)); \ PPC_LD(r, r, IMM_L(i)); } } while(0) diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c index cbae2df..d110e28 100644 --- a/arch/powerpc/net/bpf_jit_comp.c +++ b/arch/powerpc/net/bpf_jit_comp.c @@ -407,6 +407,11 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff, queue_mapping)); break; + case BPF_ANC | SKF_AD_PKTTYPE: + PPC_LBZ_OFFS(r_A, r_skb, PKT_TYPE_OFFSET()); + PPC_ANDI(r_A, r_A, PKT_TYPE_MAX); + PPC_SRWI(r_A, r_A, 5); + break; case BPF_ANC | SKF_AD_CPU: #ifdef CONFIG_SMP /*