From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2423CC2D0EC for ; Sat, 28 Mar 2020 20:01:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EFDD8206E6 for ; Sat, 28 Mar 2020 20:01:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iay/TbK6" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727183AbgC1UBW (ORCPT ); Sat, 28 Mar 2020 16:01:22 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:35919 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726976AbgC1UBW (ORCPT ); Sat, 28 Mar 2020 16:01:22 -0400 Received: by mail-qt1-f196.google.com with SMTP id m33so11767162qtb.3; Sat, 28 Mar 2020 13:01:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=VZzCjb9q+eLm/MFNwpd1q7LlfqoQEdzpIA7cxtVJw24=; b=iay/TbK68+z2P3L+hg4XUSfLy7Vjui2vv2P7OYDynyKXjWOXt6j/AtwHUUzNEDVDuw 481CLVx6q0SywOAAoLY7qpl/X1Gf62W4U78cqTb3Zdjkwc121DEWV+n1EtFMHJIRJJeH ygm1ZQ15PVWvEZvso9i5jWr0Lbl5JDn9PwyeVzxB8acL+t0q8Ov7Od0T2UjUzpEdGIvg vy/pDNvlF5Jf5EqEolXhJNSc14P00eIY5O42FsmWJDKDH6VA+1wti0uCIEM2MdcJteCh Ka6jvHHuZ3ximaVnCnuRkMreW01y/XQA7VNKF3Z5s3Sro3vJQN4mjpm0RVC6VXQJ2REW 4log== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=VZzCjb9q+eLm/MFNwpd1q7LlfqoQEdzpIA7cxtVJw24=; b=gZq/7hYA0SO9m5LsN8zbVU7Ig1TsYq5NdWBYqc1e3F4RLJ1GlNsS+u0P+3HycIWJcG w1C9uOfGgLfQFw4N8TgQBNAmRoi+2lurZekH0fTjmL1Npmt5/GXF/Npjvil6JgqpaJ3V xbwSqFtl9MhXB3A7++/iW4JltHuLBMvU+to9g6yeQe+8/ctK6OBLf4Oa/x0eUj6GfpGg YNXPH2aBzjRqVqqet8j2uB4avzoKHiKFSUHHXxDBK62dVElI0QHXcPPM6tMo0hN9S5Jl 5itxOjxYcF5VFwFnOEWrBtRNpc8E230WtzvhV+g/4bjvm4eRPcgv7iB+z2KWm9qyxP4g cFfw== X-Gm-Message-State: ANhLgQ3HNZlA2Py1llTRz4xq2Y4vUMUq8mQ2nR0ZX/au/DdZAhtFroLl f5YNr+yreau6iTGiMuWvdWpf5VklGwQy4Wq6HQ3Wbl1h X-Google-Smtp-Source: ADFU+vuy6oRooaYic1esN0Dmi4VXfSabbGIC3SzRTGYTrgjrK7Lhx2METzUSMpXjmu9SFGurTRkugCrLSUqauHSS9IU= X-Received: by 2002:ac8:1865:: with SMTP id n34mr4957820qtk.93.1585425679099; Sat, 28 Mar 2020 13:01:19 -0700 (PDT) MIME-Version: 1.0 References: <20200327125818.155522-1-toke@redhat.com> <20200328182834.196578-1-toke@redhat.com> In-Reply-To: <20200328182834.196578-1-toke@redhat.com> From: Andrii Nakryiko Date: Sat, 28 Mar 2020 13:01:08 -0700 Message-ID: Subject: Re: [PATCH v3 1/2] libbpf: Add setter for initial value for internal maps To: =?UTF-8?B?VG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2Vu?= Cc: Daniel Borkmann , Alexei Starovoitov , bpf , Networking Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org On Sat, Mar 28, 2020 at 11:29 AM Toke H=C3=B8iland-J=C3=B8rgensen wrote: > > For internal maps (most notably the maps backing global variables), libbp= f > 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 RODA= TA > maps, since those are frozen on load. > > Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen > --- > v3: > - Add a setter for the initial value instead of a getter for the pointe= r to it > - Add selftest > v2: > - Add per-map getter for data area instead of a global rodata getter fo= r 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) nit: const void * > +{ > + if (!map->mmaped || map->libbpf_type =3D=3D LIBBPF_MAP_KCONFIG || > + size !=3D map->def.value_size) > + return -EINVAL; > + How about also checking that bpf_map wasn't yet created? Checking map->fd >=3D 0 should be enough. > + memcpy(map->mmaped, data, size); > + return 0; > +} > + > bool bpf_map__is_offload_neutral(const struct bpf_map *map) > { > return map->def.type =3D=3D 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; > -- > 2.26.0 >