From patchwork Sat Mar 28 18:28:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= X-Patchwork-Id: 1263279 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 (no SPF record) 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=pass (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=CoOfPwsL; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48qS0y2tmQz9sRR for ; Sun, 29 Mar 2020 05:29:04 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727144AbgC1S3D (ORCPT ); Sat, 28 Mar 2020 14:29:03 -0400 Received: from us-smtp-delivery-74.mimecast.com ([216.205.24.74]:51252 "EHLO us-smtp-delivery-74.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726937AbgC1S3D (ORCPT ); Sat, 28 Mar 2020 14:29:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585420142; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=O1TasnobZysGj1AsegupcFxLIotb9pYqfJEh44oqQH0=; b=CoOfPwsLTF/U8CsaoDAKv5jcIDYFgC/3SzVdXxivs63k7iQh7hBAcTRs4XHzyFaRBOurin vqD8NLzRYDe1S8sWfhDltkbTofO670KvmEII/WyHtnyQ25+buXWdFP4LwLz/Mg7z0kvbEz wEMV1OdWUMaiH2g7NSJc+sYb7BaJCng= Received: from mail-lf1-f72.google.com (mail-lf1-f72.google.com [209.85.167.72]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-253-0Ufu7oy_NlmEvoIqtU3c0A-1; Sat, 28 Mar 2020 14:29:00 -0400 X-MC-Unique: 0Ufu7oy_NlmEvoIqtU3c0A-1 Received: by mail-lf1-f72.google.com with SMTP id b25so5408041lfi.21 for ; Sat, 28 Mar 2020 11:29:00 -0700 (PDT) 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:mime-version:content-transfer-encoding; bh=O1TasnobZysGj1AsegupcFxLIotb9pYqfJEh44oqQH0=; b=cP1hCYcC88LckGaKpYdAjBRghlZfWQX58NwSXaYotVccy0l/djyBoEskxil4pppEvX Ls89ec5ontbyYIPHqAVF1cYIEVPdGNQXcdGQ0Pyo9Ud/EYWXQ8KFzclL0DOAP26BTLaN dcshS7cHiey736jW3KFSHWzhJLcC9/luoMpLo8n2m7Ks1pdSJfdDDkUQrbcdFvpbP9ib 0nt8a2MdhDcokLKzliS5kDVMFeeEuwoMqnB0XLX8KLYPTsjTYYo2jHdcXvd/gTAeI16P xwal0+WK2LtNNxH88sbIgXv39jcnuzdbyD0MHbNZO4XxYfN8efP7Ar89KMasGt65WqxQ ctgQ== X-Gm-Message-State: AGi0PubFJ40lXQ4ZmvxtAQ2Ce5CnhlWVZAqTW2mBmDCSN/Z2RoIpV8xS /LebP+gIU81fUORS2UEu3AWjnEXuhL0gjYGmxzLgL2pQ57Mie/MNUAq6e6xIfLplsY41OA28+MD TSm/q8YIRZcWYLLJY X-Received: by 2002:a05:651c:3cf:: with SMTP id f15mr2718959ljp.184.1585420138633; Sat, 28 Mar 2020 11:28:58 -0700 (PDT) X-Google-Smtp-Source: APiQypLHemQGe8LrMZLmWFOUAnSME0fLHHctBC7ZI9YxnkOch5W8BiLdIxjlCMFW9+foOBuJLm6uBg== X-Received: by 2002:a05:651c:3cf:: with SMTP id f15mr2718948ljp.184.1585420138357; Sat, 28 Mar 2020 11:28:58 -0700 (PDT) Received: from alrua-x1.borgediget.toke.dk ([2a0c:4d80:42:443::2]) by smtp.gmail.com with ESMTPSA id f6sm1306932lfm.40.2020.03.28.11.28.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Mar 2020 11:28:57 -0700 (PDT) Received: by alrua-x1.borgediget.toke.dk (Postfix, from userid 1000) id 9409C18158B; Sat, 28 Mar 2020 19:28:54 +0100 (CET) From: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= To: daniel@iogearbox.net, ast@fb.com Cc: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , bpf@vger.kernel.org, netdev@vger.kernel.org, Andrii Nakryiko Subject: [PATCH v3 1/2] libbpf: Add setter for initial value for internal maps Date: Sat, 28 Mar 2020 19:28:33 +0100 Message-Id: <20200328182834.196578-1-toke@redhat.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200327125818.155522-1-toke@redhat.com> References: <20200327125818.155522-1-toke@redhat.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org For internal maps (most notably the maps backing global variables), libbpf uses an internal mmaped area to store the data after opening the object. This data is subsequently copied into the kernel map when the object is loaded. This adds a function to set a new value for that data, which can be used to before it is loaded into the kernel. This is especially relevant for RODATA maps, since those are frozen on load. Signed-off-by: Toke Høiland-Jørgensen --- v3: - Add a setter for the initial value instead of a getter for the pointer to it - Add selftest v2: - Add per-map getter for data area instead of a global rodata getter for bpf_obj tools/lib/bpf/libbpf.c | 11 +++++++++++ tools/lib/bpf/libbpf.h | 2 ++ tools/lib/bpf/libbpf.map | 1 + 3 files changed, 14 insertions(+) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 085e41f9b68e..f9953a8ffcfa 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -6756,6 +6756,17 @@ void *bpf_map__priv(const struct bpf_map *map) return map ? map->priv : ERR_PTR(-EINVAL); } +int bpf_map__set_initial_value(struct bpf_map *map, + void *data, size_t size) +{ + if (!map->mmaped || map->libbpf_type == LIBBPF_MAP_KCONFIG || + size != map->def.value_size) + return -EINVAL; + + memcpy(map->mmaped, data, size); + return 0; +} + bool bpf_map__is_offload_neutral(const struct bpf_map *map) { return map->def.type == BPF_MAP_TYPE_PERF_EVENT_ARRAY; diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index d38d7a629417..ee30ed487221 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -407,6 +407,8 @@ typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *); LIBBPF_API int bpf_map__set_priv(struct bpf_map *map, void *priv, bpf_map_clear_priv_t clear_priv); LIBBPF_API void *bpf_map__priv(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_initial_value(struct bpf_map *map, + void *data, size_t size); LIBBPF_API int bpf_map__reuse_fd(struct bpf_map *map, int fd); LIBBPF_API int bpf_map__resize(struct bpf_map *map, __u32 max_entries); LIBBPF_API bool bpf_map__is_offload_neutral(const struct bpf_map *map); diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map index 5129283c0284..f46873b9fe5e 100644 --- a/tools/lib/bpf/libbpf.map +++ b/tools/lib/bpf/libbpf.map @@ -243,5 +243,6 @@ LIBBPF_0.0.8 { bpf_link__pin; bpf_link__pin_path; bpf_link__unpin; + bpf_map__set_initial_value; bpf_program__set_attach_target; } LIBBPF_0.0.7; From patchwork Sun Mar 29 13:22:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= X-Patchwork-Id: 1263430 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=c2giCFgn; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48qx9m07Nxz9sSN for ; Mon, 30 Mar 2020 00:23:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728160AbgC2NXX (ORCPT ); Sun, 29 Mar 2020 09:23:23 -0400 Received: from us-smtp-delivery-74.mimecast.com ([216.205.24.74]:25583 "EHLO us-smtp-delivery-74.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727903AbgC2NXX (ORCPT ); Sun, 29 Mar 2020 09:23:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585488202; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OZFLzRVXjwY6yHEiQIg/pyvTxROQmEiSKkLvpEN2SzQ=; b=c2giCFgnbR1JMJ0llP4gunr4miso4lrEFQZyTBZUBnys4UNjK5ypapEprm3h0An1Z6DxeJ m3QjcPzfOZCD20LYWQMa+bH9ncXI35fDMMN0ABtUY6vxMFFb7Ej1utWW0Njz0QcnQxD+ga sfsr5g5WDwO09iHqgmi8VHqra9bTcvk= Received: from mail-lf1-f71.google.com (mail-lf1-f71.google.com [209.85.167.71]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-473-9zn1HqTbMkSVZ5r9YJ_mLg-1; Sun, 29 Mar 2020 09:23:20 -0400 X-MC-Unique: 9zn1HqTbMkSVZ5r9YJ_mLg-1 Received: by mail-lf1-f71.google.com with SMTP id c20so6137014lfh.6 for ; Sun, 29 Mar 2020 06:23:20 -0700 (PDT) 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:mime-version:content-transfer-encoding; bh=OZFLzRVXjwY6yHEiQIg/pyvTxROQmEiSKkLvpEN2SzQ=; b=auLjkR2tuRpX3G048wqaJQtQ7v7nP7xQAtbbWcAnqZd4kPY+sh3HaAUkUd/zELIIm9 ycxE97zn3AVHXCN8eC372a/iHXbZF7/yCdWy5tMAzxFKNO/8RzMWcz3D+3RVDHPYgN63 uuKDYYiTJjezCPW0q+qzBSVeGhjQVFa6Dj1RwCWs7+ToDVCxim8LCalndVPgErLnGuPv vtGTJ8HpAxUGoZNmg6dm0iaR2xvoMzi600+QDpOIqjM4NH/CiJaZunoa0W6WXdqxXUiH TQ6s/TRdZn1aYHHDwevKwcsKKN/Slw2JhMKwseiV4G2+omzHSDab59xFT8r+0QK24Ltr Strg== X-Gm-Message-State: AGi0PuaTGXTMaOn0hsDGJ6oqASiUOsEWXk6XUYE560as2Upjbom5WnaS Js5P5UeXN+ubh9jRTJnfDDS0EBOnu17+Xps+2Ak9tCWE/rwBKllkgn8AWqYYnEbd6dCU5qbprxq Vbg+6mgpqxyUP X-Received: by 2002:a19:ad4c:: with SMTP id s12mr5373858lfd.109.1585488199029; Sun, 29 Mar 2020 06:23:19 -0700 (PDT) X-Google-Smtp-Source: APiQypKzM3OHFU9gSHkmUycO3u9W7lD8lS5lDtQTZ024FRfMSoOOHg++98O8Pf5keKxWYmI/6T9nkg== X-Received: by 2002:a19:ad4c:: with SMTP id s12mr5373832lfd.109.1585488198481; Sun, 29 Mar 2020 06:23:18 -0700 (PDT) Received: from alrua-x1.borgediget.toke.dk ([2a0c:4d80:42:443::2]) by smtp.gmail.com with ESMTPSA id q30sm2921212lfn.18.2020.03.29.06.23.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Mar 2020 06:23:17 -0700 (PDT) Received: by alrua-x1.borgediget.toke.dk (Postfix, from userid 1000) id 1FC9F18158C; Sun, 29 Mar 2020 15:23:15 +0200 (CEST) From: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= To: daniel@iogearbox.net, ast@fb.com Cc: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , bpf@vger.kernel.org, netdev@vger.kernel.org, Andrii Nakryiko Subject: [PATCH v4 2/2] selftests: Add test for overriding global data value before load Date: Sun, 29 Mar 2020 15:22:53 +0200 Message-Id: <20200329132253.232541-2-toke@redhat.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200328182834.196578-1-toke@redhat.com> References: <20200328182834.196578-1-toke@redhat.com> MIME-Version: 1.0 Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org This adds a test to exercise the new bpf_map__set_initial_value() function. The test simply overrides the global data section with all zeroes, and checks that the new value makes it into the kernel map on load. Signed-off-by: Toke Høiland-Jørgensen Acked-by: Andrii Nakryiko --- .../bpf/prog_tests/global_data_init.c | 61 +++++++++++++++++++ .../selftests/bpf/progs/test_global_data.c | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/bpf/prog_tests/global_data_init.c diff --git a/tools/testing/selftests/bpf/prog_tests/global_data_init.c b/tools/testing/selftests/bpf/prog_tests/global_data_init.c new file mode 100644 index 000000000000..3bdaa5a40744 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/global_data_init.c @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0 +#include + +void test_global_data_init(void) +{ + const char *file = "./test_global_data.o"; + int err = -ENOMEM, map_fd, zero = 0; + __u8 *buff = NULL, *newval = NULL; + struct bpf_object *obj; + struct bpf_map *map; + __u32 duration = 0; + size_t sz; + + obj = bpf_object__open_file(file, NULL); + if (CHECK_FAIL(!obj)) + return; + + map = bpf_object__find_map_by_name(obj, "test_glo.rodata"); + if (CHECK_FAIL(!map || !bpf_map__is_internal(map))) + goto out; + + sz = bpf_map__def(map)->value_size; + newval = malloc(sz); + if (CHECK_FAIL(!newval)) + goto out; + + memset(newval, 0, sz); + /* wrong size, should fail */ + err = bpf_map__set_initial_value(map, newval, sz - 1); + if (CHECK(!err, "reject set initial value wrong size", "err %d\n", err)) + goto out; + + err = bpf_map__set_initial_value(map, newval, sz); + if (CHECK(err, "set initial value", "err %d\n", err)) + goto out; + + err = bpf_object__load(obj); + if (CHECK_FAIL(err)) + goto out; + + map_fd = bpf_map__fd(map); + if (CHECK_FAIL(map_fd < 0)) + goto out; + + buff = malloc(sz); + if (buff) + err = bpf_map_lookup_elem(map_fd, &zero, buff); + if (CHECK(!buff || err || memcmp(buff, newval, sz), + "compare .rodata map data override", + "err %d errno %d\n", err, errno)) + goto out; + + memset(newval, 1, sz); + /* object loaded - should fail */ + err = bpf_map__set_initial_value(map, newval, sz); + CHECK(!err, "reject set initial value after load", "err %d\n", err); +out: + free(buff); + free(newval); + bpf_object__close(obj); +} diff --git a/tools/testing/selftests/bpf/progs/test_global_data.c b/tools/testing/selftests/bpf/progs/test_global_data.c index dd7a4d3dbc0d..1319be1c54ba 100644 --- a/tools/testing/selftests/bpf/progs/test_global_data.c +++ b/tools/testing/selftests/bpf/progs/test_global_data.c @@ -68,7 +68,7 @@ static struct foo struct3 = { bpf_map_update_elem(&result_##map, &key, var, 0); \ } while (0) -SEC("static_data_load") +SEC("classifier/static_data_load") int load_static_data(struct __sk_buff *skb) { static const __u64 bar = ~0;