From patchwork Tue Mar 26 18:05:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1065882 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="VlLzt1gw"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44TJww6ZYHz9sSb for ; Wed, 27 Mar 2019 05:06:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732462AbfCZSGj (ORCPT ); Tue, 26 Mar 2019 14:06:39 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:36750 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732434AbfCZSGi (ORCPT ); Tue, 26 Mar 2019 14:06:38 -0400 Received: by mail-wm1-f68.google.com with SMTP id h18so14003637wml.1 for ; Tue, 26 Mar 2019 11:06:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=LIVt0dF8T96GyCFFdLmKckPQiAfo4lzXRZU1y+SNemA=; b=VlLzt1gwAX0AzFo5X/Aj75AjSCbf1ZJ8BVJRg9x1T3FnCJ13S2FPK0BZW7ONXFCrgO 6uxaw2Aa2KUO1rkPunjcBQZZJoT98l2RCdqUEudOT8aBHh8Gc8Z+DXAQnSyOmh7GnPh5 JZy9d92ZN4uFm46qy1y85V1bMdTlEvszNGT5LTAxWdIFvRbCoLqBVVMtO0NF8LsMaXbK gJYmH+9/KF03zfMv5eU9QrRpofu/1X5Q8T9/oKu7mJBAhOB8a+LbwfORDx8E/JMnTHrg ngtGlJ1K6oxJ8JTgpxoPzrEkOVyMeAZmWrJz5QphvN3UJIQapLhARnc2aNeXrT+g3qzG aNiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=LIVt0dF8T96GyCFFdLmKckPQiAfo4lzXRZU1y+SNemA=; b=MjfGW1O5cHRJWbOSmbyWE86K7THw23atIE/Abv8QAFyHotB6HOG8UVm6lYhYA+gApi TB8dXtcRkFmfUSl+95MPyB9b7g27kFEC3/hG6WAxRcAJjI8NSM+KPU8smeD5XC86UMA6 IawbHDKLuVgpBKDe/pfa9KrTPgt2eoANaT8smAypVzs/2dHDAyN9kA4DNtmnxNZFpFRK WTEURvGs2hpR04hYtrRn/zh/QxeYL2YaUaF3Nj4kcOiHjR2mq5HOfUibqtl40LGxWqTZ +DjE3fPn5aUH1dRsCUUv/zzVfl9xCJ8/ZLrkIFB4OxTXgVEhm7EdqzSn117SC9Y50vFu BjfQ== X-Gm-Message-State: APjAAAXn4xNQOkaHTIoUqZaIMBWn6iQiHcILMDQ//K7R94/RsxPdyYl8 8sITIWS2eq1/1127M93AuJRuLQ== X-Google-Smtp-Source: APXvYqwFTHtA2OtmuDEstdgpORaj0gGh74NGh3RCSQbg57GifQsbHcGu8lfqTDzgNAg6A5glXldkCA== X-Received: by 2002:a1c:988d:: with SMTP id a135mr9816994wme.24.1553623596490; Tue, 26 Mar 2019 11:06:36 -0700 (PDT) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id i28sm36697534wrc.32.2019.03.26.11.06.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 26 Mar 2019 11:06:35 -0700 (PDT) From: Jiong Wang To: alexei.starovoitov@gmail.com, daniel@iogearbox.net Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang Subject: [PATCH/RFC bpf-next 02/16] bpf: refactor propagate_live implementation Date: Tue, 26 Mar 2019 18:05:25 +0000 Message-Id: <1553623539-15474-3-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1553623539-15474-1-git-send-email-jiong.wang@netronome.com> References: <1553623539-15474-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Some code inside current implementation of "propagate_liveness" is a little bit verbose. This patch refactor them so the code looks more simple and more clear. The redundant usage of "vparent->frame[vstate->curframe]" is removed as we are here. It is safe to do this because "state_equal" has guaranteed that vstate->curframe must be equal with vparent->curframe. Signed-off-by: Jiong Wang --- kernel/bpf/verifier.c | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 6cc8c38..245bb3c 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -6050,6 +6050,22 @@ static bool states_equal(struct bpf_verifier_env *env, return true; } +static int propagate_liveness_reg(struct bpf_verifier_env *env, + struct bpf_reg_state *reg, + struct bpf_reg_state *parent_reg, u8 flag) +{ + int err; + + if (parent_reg->live & flag || !(reg->live & flag)) + return 0; + + err = mark_reg_read(env, reg, parent_reg); + if (err) + return err; + + return 1; +} + /* A write screens off any subsequent reads; but write marks come from the * straight-line code between a state and its parent. When we arrive at an * equivalent state (jump target or such) we didn't arrive by the straight-line @@ -6061,8 +6077,9 @@ static int propagate_liveness(struct bpf_verifier_env *env, const struct bpf_verifier_state *vstate, struct bpf_verifier_state *vparent) { - int i, frame, err = 0; + struct bpf_reg_state *regs, *parent_regs; struct bpf_func_state *state, *parent; + int i, frame, err = 0; if (vparent->curframe != vstate->curframe) { WARN(1, "propagate_live: parent frame %d current frame %d\n", @@ -6071,16 +6088,13 @@ static int propagate_liveness(struct bpf_verifier_env *env, } /* Propagate read liveness of registers... */ BUILD_BUG_ON(BPF_REG_FP + 1 != MAX_BPF_REG); + parent_regs = vparent->frame[vparent->curframe]->regs; + regs = vstate->frame[vstate->curframe]->regs; /* We don't need to worry about FP liveness because it's read-only */ for (i = 0; i < BPF_REG_FP; i++) { - if (vparent->frame[vparent->curframe]->regs[i].live & REG_LIVE_READ) - continue; - if (vstate->frame[vstate->curframe]->regs[i].live & REG_LIVE_READ) { - err = mark_reg_read(env, &vstate->frame[vstate->curframe]->regs[i], - &vparent->frame[vstate->curframe]->regs[i]); - if (err) - return err; - } + err = propagate_liveness_reg(env, ®s[i], &parent_regs[i]); + if (err < 0) + return err; } /* ... and stack slots */ @@ -6089,11 +6103,13 @@ static int propagate_liveness(struct bpf_verifier_env *env, parent = vparent->frame[frame]; for (i = 0; i < state->allocated_stack / BPF_REG_SIZE && i < parent->allocated_stack / BPF_REG_SIZE; i++) { - if (parent->stack[i].spilled_ptr.live & REG_LIVE_READ) - continue; - if (state->stack[i].spilled_ptr.live & REG_LIVE_READ) - mark_reg_read(env, &state->stack[i].spilled_ptr, - &parent->stack[i].spilled_ptr); + struct bpf_reg_state *parent_reg, *reg; + + parent_reg = &parent->stack[i].spilled_ptr; + reg = &state->stack[i].spilled_ptr; + err = propagate_liveness_reg(env, reg, parent_reg); + if (err < 0) + return err; } } return err;