From patchwork Fri Nov 24 02:12:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 840932 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="gv+86xsk"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yjfqJ2ywGz9s76 for ; Fri, 24 Nov 2017 13:13:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752965AbdKXCM6 (ORCPT ); Thu, 23 Nov 2017 21:12:58 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:39376 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752163AbdKXCMW (ORCPT ); Thu, 23 Nov 2017 21:12:22 -0500 Received: by mail-pf0-f195.google.com with SMTP id l24so14175940pfj.6 for ; Thu, 23 Nov 2017 18:12:21 -0800 (PST) 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=bNLko7h8yNAL0P6wrNwO/I1axTH94HRLQML4Uv1A92Q=; b=gv+86xskF1nAtXfzNrwnpv2rc076m8SaXGEQmj3Km89tXsKpqr/zPQWM8nbCkraWfX JQx3+gnwBgN1R+VvWZK5IkcOvCXsJgz5Wn3SxcvZWYVesbEcbmFaNZTl6od+oPHvFZKo GNjJ3Di/xOknq3GCHWakhcqhhqpyOAmNI2e2K2JButk3y5xcnasHIjq335wQdYdRotEV 0rqj4VO6ynNNZXix2VzVAZ20dORM4FViRI1bw89Fqv6wNocNwIbb7cvX1EE5jv5/KozV zr1aPhRV5+TuLhpyB7z1MQW28CmrdsWJRif7cUm4xXWBugZbdrghqGbQQu3XMgvNgeHX 0YBA== 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=bNLko7h8yNAL0P6wrNwO/I1axTH94HRLQML4Uv1A92Q=; b=M3tWuNkQKbMFxMC856Zs2ZKfKEPvfZ5Vj6uTgTQVrKANcCJGdcGqghIenee15oZe2f /4YARB7StyOekkGXCvpC6cw8x+vUws2spyeq8N8EVtYFpqTNHvOXgfy4eLcbgBI1dQcA 71JDsa+Ztc6sHrrSZOb32O94+p8CdAyQgcG4TMFyt8/RP//UFWw2oyq8u8e0aJjuEXnM pk4uF9m5L/wBpZYyy495UpESNNKRosZlFfNLDMt9QaJCyecY0X+UEih0gXFEmKZZ6pw1 RzIJhizMejO5/nILCI78iLkleCkpx3teuFBYX1U5EvoL25pD38VA9bNNxRvSmloutzb2 06YA== X-Gm-Message-State: AJaThX500K5WkaWYe/hPXilHl6zMT0BEZDNN2JAg2PfBCWBj5QaYO6+F 2gp7qcKaXYnENCxm2ETtHtcdukgq X-Google-Smtp-Source: AGs4zMYHTBJOS3RCSx3ZecDc9DXDMcT3wpY/Jf6Ne/wJIS3DYsKzrvOaVhR2P6Bucz8qyBS1tXk/ug== X-Received: by 10.101.67.6 with SMTP id j6mr19454842pgq.278.1511489541077; Thu, 23 Nov 2017 18:12:21 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id q12sm29400889pgn.56.2017.11.23.18.12.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 23 Nov 2017 18:12:20 -0800 (PST) From: Jakub Kicinski To: netdev@vger.kernel.org Cc: oss-drivers@netronome.com, daniel@iogearbox.net, Jakub Kicinski Subject: [PATCH iproute2/master 04/11] bpf: split parse from program loading Date: Thu, 23 Nov 2017 18:12:01 -0800 Message-Id: <20171124021208.13419-5-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171124021208.13419-1-jakub.kicinski@netronome.com> References: <20171124021208.13419-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Parsing command line is currently done together with potentially loading a new eBPF program. This makes it more difficult to provide additional parameters for loading (which may come after the eBPF program info on the command line). Split the two (only internally for now). Verbose parameter has to be saved in struct bpf_cfg_in to be carried between the stages. Signed-off-by: Jakub Kicinski Reviewed-by: Quentin Monnet Acked-by: Daniel Borkmann --- include/bpf_util.h | 5 +++++ lib/bpf.c | 49 +++++++++++++++++++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/include/bpf_util.h b/include/bpf_util.h index 638721f6315a..8e39a2d489db 100644 --- a/include/bpf_util.h +++ b/include/bpf_util.h @@ -70,9 +70,14 @@ struct bpf_cfg_in { const char *uds; enum bpf_prog_type type; enum bpf_mode mode; + bool verbose; int argc; char **argv; struct sock_filter opcodes[BPF_MAXINSNS]; + union { + int n_opcodes; + int prog_fd; + }; }; /* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */ diff --git a/lib/bpf.c b/lib/bpf.c index 7493595ab1d6..52f7c790065f 100644 --- a/lib/bpf.c +++ b/lib/bpf.c @@ -805,7 +805,7 @@ static int bpf_obj_pinned(const char *pathname, enum bpf_prog_type type) return prog_fd; } -static int bpf_parse(struct bpf_cfg_in *cfg, const bool *opt_tbl) +static int bpf_do_parse(struct bpf_cfg_in *cfg, const bool *opt_tbl) { const char *file, *section, *uds_name; bool verbose = false; @@ -893,25 +893,39 @@ static int bpf_parse(struct bpf_cfg_in *cfg, const bool *opt_tbl) PREV_ARG(); } - if (cfg->mode == CBPF_BYTECODE || cfg->mode == CBPF_FILE) + if (cfg->mode == CBPF_BYTECODE || cfg->mode == CBPF_FILE) { ret = bpf_ops_parse(argc, argv, cfg->opcodes, cfg->mode == CBPF_FILE); - else if (cfg->mode == EBPF_OBJECT) - ret = bpf_obj_open(file, cfg->type, section, verbose); - else if (cfg->mode == EBPF_PINNED) + cfg->n_opcodes = ret; + } else if (cfg->mode == EBPF_OBJECT) { + ret = 0; /* program will be loaded by load stage */ + } else if (cfg->mode == EBPF_PINNED) { ret = bpf_obj_pinned(file, cfg->type); - else + cfg->prog_fd = ret; + } else { return -1; + } cfg->object = file; cfg->section = section; cfg->uds = uds_name; cfg->argc = argc; cfg->argv = argv; + cfg->verbose = verbose; return ret; } +static int bpf_do_load(struct bpf_cfg_in *cfg) +{ + if (cfg->mode == EBPF_OBJECT) { + cfg->prog_fd = bpf_obj_open(cfg->object, cfg->type, + cfg->section, cfg->verbose); + return cfg->prog_fd; + } + return 0; +} + static int bpf_parse_opt_tbl(struct bpf_cfg_in *cfg, const struct bpf_cfg_ops *ops, void *nl, const bool *opt_tbl) @@ -919,17 +933,21 @@ static int bpf_parse_opt_tbl(struct bpf_cfg_in *cfg, char annotation[256]; int ret; - ret = bpf_parse(cfg, opt_tbl); + ret = bpf_do_parse(cfg, opt_tbl); + if (ret < 0) + return ret; + + ret = bpf_do_load(cfg); if (ret < 0) return ret; if (cfg->mode == CBPF_BYTECODE || cfg->mode == CBPF_FILE) - ops->cbpf_cb(nl, cfg->opcodes, ret); + ops->cbpf_cb(nl, cfg->opcodes, cfg->n_opcodes); if (cfg->mode == EBPF_OBJECT || cfg->mode == EBPF_PINNED) { snprintf(annotation, sizeof(annotation), "%s:[%s]", basename(cfg->object), cfg->mode == EBPF_PINNED ? "*fsobj" : cfg->section); - ops->ebpf_cb(nl, ret, annotation); + ops->ebpf_cb(nl, cfg->prog_fd, annotation); } return 0; @@ -973,9 +991,16 @@ int bpf_graft_map(const char *map_path, uint32_t *key, int argc, char **argv) int ret, prog_fd, map_fd; uint32_t map_key; - prog_fd = bpf_parse(&cfg, opt_tbl); - if (prog_fd < 0) - return prog_fd; + ret = bpf_do_parse(&cfg, opt_tbl); + if (ret < 0) + return ret; + + ret = bpf_do_load(&cfg); + if (ret < 0) + return ret; + + prog_fd = cfg.prog_fd; + if (key) { map_key = *key; } else {