From patchwork Fri Sep 2 01:37:21 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexei Starovoitov X-Patchwork-Id: 665095 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 3sQMFG6mVvz9sxN for ; Fri, 2 Sep 2016 11:37:38 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=fb.com header.i=@fb.com header.b=alaTOVqz; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752492AbcIBBhf (ORCPT ); Thu, 1 Sep 2016 21:37:35 -0400 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:60137 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752172AbcIBBh3 (ORCPT ); Thu, 1 Sep 2016 21:37:29 -0400 Received: from pps.filterd (m0089730.ppops.net [127.0.0.1]) by m0089730.ppops.net (8.16.0.17/8.16.0.17) with SMTP id u821XSqg026926 for ; Thu, 1 Sep 2016 18:37:28 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=facebook; bh=f9c3XUr7O+tEYQjAC3zPEYDqmanD8lc9xbqNhrGQAmo=; b=alaTOVqzUtcBDipXTOxhvoFJs0cwtJ4LcmhjySj9kITKlIqlM81vZlHzjEkOBEiLvUYK NzUPI1I/UXIssqH+5LiUFvZ8i0iah0eJINi2ncE37ulyX13xV0qw5FidElGjSP4mtKzr LkKzLTKdlJatyWZY4JHULv3nlnjdB/dBdaE= Received: from mail.thefacebook.com ([199.201.64.23]) by m0089730.ppops.net with ESMTP id 2564m064kb-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Thu, 01 Sep 2016 18:37:28 -0700 Received: from mx-out.facebook.com (192.168.52.123) by PRN-CHUB01.TheFacebook.com (192.168.16.11) with Microsoft SMTP Server (TLS) id 14.3.294.0; Thu, 1 Sep 2016 18:37:27 -0700 Received: from facebook.com (2401:db00:11:d093:face:0:1b:0) by mx-out.facebook.com (10.102.107.99) with ESMTP id ce2f81e870ad11e681540002c99293a0-b0bfda50 for ; Thu, 01 Sep 2016 18:37:27 -0700 Received: by devbig505.prn1.facebook.com (Postfix, from userid 572438) id 20B932242275; Thu, 1 Sep 2016 18:37:27 -0700 (PDT) From: Alexei Starovoitov To: "David S . Miller" CC: Peter Zijlstra , Brendan Gregg , Daniel Borkmann , Arnaldo Carvalho de Melo , Wang Nan , , , Subject: [PATCH v3 net-next 1/6] bpf: support 8-byte metafield access Date: Thu, 1 Sep 2016 18:37:21 -0700 Message-ID: <1472780246-323814-2-git-send-email-ast@fb.com> X-Mailer: git-send-email 2.8.0 In-Reply-To: <1472780246-323814-1-git-send-email-ast@fb.com> References: <1472780246-323814-1-git-send-email-ast@fb.com> X-FB-Internal: Safe MIME-Version: 1.0 X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-09-01_10:, , signatures=0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The verifier supported only 4-byte metafields in struct __sk_buff and struct xdp_md. The metafields in upcoming struct bpf_perf_event are 8-byte to match register width in struct pt_regs. Teach verifier to recognize 8-byte metafield access. The patch doesn't affect safety of sockets and xdp programs. They check for 4-byte only ctx access before these conditions are hit. Signed-off-by: Alexei Starovoitov Acked-by: Daniel Borkmann --- kernel/bpf/verifier.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index abb61f3f6900..c1c9e441f0f5 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -2333,7 +2333,8 @@ static int do_check(struct verifier_env *env) if (err) return err; - if (BPF_SIZE(insn->code) != BPF_W) { + if (BPF_SIZE(insn->code) != BPF_W && + BPF_SIZE(insn->code) != BPF_DW) { insn_idx++; continue; } @@ -2642,9 +2643,11 @@ static int convert_ctx_accesses(struct verifier_env *env) for (i = 0; i < insn_cnt; i++, insn++) { u32 insn_delta, cnt; - if (insn->code == (BPF_LDX | BPF_MEM | BPF_W)) + if (insn->code == (BPF_LDX | BPF_MEM | BPF_W) || + insn->code == (BPF_LDX | BPF_MEM | BPF_DW)) type = BPF_READ; - else if (insn->code == (BPF_STX | BPF_MEM | BPF_W)) + else if (insn->code == (BPF_STX | BPF_MEM | BPF_W) || + insn->code == (BPF_STX | BPF_MEM | BPF_DW)) type = BPF_WRITE; else continue;