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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id E842BC54E58 for ; Mon, 11 Mar 2024 17:09:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7E3FA6B00EF; Mon, 11 Mar 2024 13:09:07 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 794136B00F0; Mon, 11 Mar 2024 13:09:07 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 65C526B00F1; Mon, 11 Mar 2024 13:09:07 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 54CAB6B00EF for ; Mon, 11 Mar 2024 13:09:07 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 264EA1208B8 for ; Mon, 11 Mar 2024 17:09:07 +0000 (UTC) X-FDA: 81885393534.17.4C63FB1 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) by imf04.hostedemail.com (Postfix) with ESMTP id 1B73D40022 for ; Mon, 11 Mar 2024 17:09:03 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=isovalent.com header.s=google header.b=Keh8SDPR; dmarc=pass (policy=none) header.from=isovalent.com; spf=pass (imf04.hostedemail.com: domain of quentin@isovalent.com designates 209.85.128.48 as permitted sender) smtp.mailfrom=quentin@isovalent.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1710176944; h=from:from:sender: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:dkim-signature; bh=w7QBBvHnh4PlUsmZzoHgjUDMPYX7tQVox7z1neNLrLU=; b=cEYs6ybZ4mcC2SM5h5WEPPvzO6pchSd/CkdbUs/Z+63voNzEO4Yo0/CGsLfANhHjePd4hz soOzgPp0jb/gmmTe+yhPWnQ3U1zlNAu40/Rz1CbWe40TdQW5XITc+K392GG6tsGCJO+hJs OqwnzK73/KvTdMA5Y/9hIbIJ1COzb6o= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=isovalent.com header.s=google header.b=Keh8SDPR; dmarc=pass (policy=none) header.from=isovalent.com; spf=pass (imf04.hostedemail.com: domain of quentin@isovalent.com designates 209.85.128.48 as permitted sender) smtp.mailfrom=quentin@isovalent.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1710176944; a=rsa-sha256; cv=none; b=fG0kjH0ilAno5erOGqKtAbxT5UaniFnoDQCXDFac1sk3tDq/4u/SWuUK8HLvAAx/3Xkal0 JUSyrLOzbnsyPCV4Htbmvw/hYoYtD9LhRdxpSNEeAHW96zOkHGp8iKBFYaRutvn+FaibGa dkLlxUnNa+bfiGMflVpVegGnvLdPbiI= Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-413318a3a29so390965e9.2 for ; Mon, 11 Mar 2024 10:09:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=isovalent.com; s=google; t=1710176943; x=1710781743; darn=kvack.org; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=w7QBBvHnh4PlUsmZzoHgjUDMPYX7tQVox7z1neNLrLU=; b=Keh8SDPRX+PTOgTPvqzdClDtiq+Uw9dVHQwYCi0H76hqAY/9HSAs69i2zw2iEikoCF E22zCTktpiJrTYbCkzzz6T/HVe26gHdqaHuRb8joH/Y1h33Orpx2Kek3otUMThTUZwwy ygwgPtAWg6SMqrRRqkhVKHxM6SeTnGppDTC6UIDgniizEKzg0rIl7iYtEao0wdgaBspw noawr004RByGHxrsg5lgwXzbMbNjBcXGarLNeGZx/HdvicP3GM1fPCLxSjYWIxIWRbMx 1RylK77ZP2eNLXTMlB2PtU0K9xPy0Vhe7G4rVPjKqYWpbCb5zn9eyQ+UOZaVi0TyRyBh xSjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710176943; x=1710781743; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=w7QBBvHnh4PlUsmZzoHgjUDMPYX7tQVox7z1neNLrLU=; b=Jk4aZehFxFhxtzKf7Ip9TOyahwV22e+5jn7RF5dCAW40RdNJmBLzG6vwx01/2eSEl7 75ikcqLhuVhWh3PWYVv33rlYl85eZX1sDfrteOqLfLq3p8VmW/MtfQGhm6o3l1LYfNC/ 5p6MZh6qxIsh1h0Aqm42H/Xffon3UVepBaOKDox0Uxd0+i0kdKgjWBKTgOTuLgIXOyuH O76srkMp/nca15i+07QKLafS1A6DPHLdjPdYx3QRpDq3sJiXBOv1948wXmGIp0rOTGnZ z7oz0dD4hWzj0hRXSewUdExKoB6H9vKcYHu+JCREuPM9vWB6R3icek01we0OssVB9xpr EMjw== X-Forwarded-Encrypted: i=1; AJvYcCVbfkcNILi22Mu0POSzX8pRjiLnN0VVKPYm6SCwb5vJB1I52N7V9CRoiGwQNTL8x1QkNukelwpk5FtlkdHKKglQovQ= X-Gm-Message-State: AOJu0Yx48emCPVBrVEGIZgZbUbSTyd4+kvp/qth0ZCt9REK68hyA9Y/q 1rAfxt3bYaFTSb5LiSwXim+cS+twaK3RgFCd0kIlSxriolOuxuDtuR3sZK3wmdU= X-Google-Smtp-Source: AGHT+IHV5C2HrXCecTMWw0lJ6pjdweGxpyvgWHlwI9xbYoiI0D8ATdcEESE5sVO/pJ0uyiTv8q8jdQ== X-Received: by 2002:a05:600c:450f:b0:413:29a4:9e99 with SMTP id t15-20020a05600c450f00b0041329a49e99mr2264852wmo.39.1710176942716; Mon, 11 Mar 2024 10:09:02 -0700 (PDT) Received: from ?IPV6:2a02:8011:e80c:0:5231:db44:25b0:339e? ([2a02:8011:e80c:0:5231:db44:25b0:339e]) by smtp.gmail.com with ESMTPSA id o2-20020a05600c4fc200b004132f9cf053sm1310682wmq.33.2024.03.11.10.09.01 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 11 Mar 2024 10:09:02 -0700 (PDT) Message-ID: Date: Mon, 11 Mar 2024 17:09:01 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3 bpf-next 10/14] libbpf: Recognize __arena global varaibles. Content-Language: en-GB To: Alexei Starovoitov , bpf@vger.kernel.org Cc: daniel@iogearbox.net, andrii@kernel.org, torvalds@linux-foundation.org, brho@google.com, hannes@cmpxchg.org, akpm@linux-foundation.org, urezki@gmail.com, hch@infradead.org, linux-mm@kvack.org, kernel-team@fb.com References: <20240308010812.89848-1-alexei.starovoitov@gmail.com> <20240308010812.89848-11-alexei.starovoitov@gmail.com> From: Quentin Monnet In-Reply-To: <20240308010812.89848-11-alexei.starovoitov@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Rspam-User: X-Stat-Signature: efuehiepj313bnfeoy3yes68ziwuamhf X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 1B73D40022 X-HE-Tag: 1710176943-813802 X-HE-Meta: U2FsdGVkX186O/C5Q+/dGOew0L31o2d7j3FlyIIhcFmHxcrDKcBIKGwiG4UNx6807ecdz1R73DJ9CVxLp0FpDUy4koEDWqUFL1Fo3LuzyqR6XDuP3sHzKvTeQrCNTYNYbXi++zH0eSOEwQlyCPcaOAYI6fqK3immg4srQ86iW2QFu/FFlF0VJHf14WF8x7aeT7l4D+dlveeayE2IxUlhmz2Hq7M3ek0AaNkU7AusXygfSZ52v9oMA9/esEOY5IIYvKSUkaQsBpDEj4oI05qWGdKe4qUmYulJhlONLhXMXOO6NCO23w27ZsUHw/5XldltjUVaO4UeJKlMcARoMAj+jqrMhQb8BTv32gxctW0++f7MQPeOb6/V5JHPLd7DSs5xdd79Dwy722JQG9CBZLwia5IxbyBGXNWFOIVHkkPsiNAgnNLe2vgIiRs22byRJew5VlbCZw8uxa5wezMA9ybmXd8F7Qdd5sIcaH+8gtObFqyPuLsX/b7OOTGBHFkFOr81an0ztpuzKF5kNc6WbtlAO0YDcSKT9fy7mBCYGNtfee0C0MqYplGhtmh83FQFkL162s/S+i+Roxm34Wo1C2/f8OehajFzJj5NeUnxp6Ez2saD3Uw8njuI+vhbnRtGjiHpvi0pr3RebntFa7X+R/N1rOG3XxvYRqm4DIMqwejfuozF1fdz3wmayED1uEdAlmxtiqPR26BXC1lEJo+0DaG6ioaWJ0hg/y6mVNdbgzSnvBryJLilhMLASb3jurrb/X5Et8a0aQxga6wJExgQ7kM47blin13j5EJ+igQnjzr8ydrRz1lw+Vll97VIh4wQOkxHEDslk07tf0z8sloG28z1txD/saNZ7CK554XNumZthYC3D4FyIa0H4mY1C6Q4f+FGE3y1/MqEUbX8Dwd1lIeAr1MpBfXf7A3hMzKHd6CH+pzs8CSXNSMrIBJgs3bqmoaTitwEXROwsR0n3Fd71Ub UYQG4hVP t9koJ9x92AgXBCwlWUVc+plylXieKnMoUjUbUrHPcaafyCySlmGUrtsFqbZpF0N3RLXJO9af6AHnKI7nDh3LH6Q+q2cncKO5spEGogE7KA9MpyJGbOHNBfZHm0pRQdduM2F5KIkhJXeQCCGuVtsQI2kB2vwW/+s3mvIgRPAzkCFuwdAXXHhHscn8VzFMJyBIFP14gJMQLt+N61SJB6YRt162Io/7n08NCzQ2meTdepetYuZXTYJxOre9VxAabd5wc4VGkrCYl89PS/uzlrUuH1WqjJEkNWa6Ho6w0q6uvGJNbKQAI1Mk2z+ilv7uk06U87dsIj84J9SxLSEporrTy63n/Od2uEhMt/Y7aNaPDN+40JVoMaPMubmWPavGwjnkuFZR3LQXpWfu/Pu82uJ80K7Tz+2+UOeMR6ORDHGcqF4xq3dEM+GNdMXJCl4uXGJJMd1XNjUF2M0BJmeIa5ZFVLvKioC+UxRP2MU5ZFSVw79G/a5SUOIL6s2GMh8Y5yJh5pI/nCoDcYAYNZwAVvS357Lzw+ZQAZQegwkW/SO5lZKXq06wXQ4/DkHML7et4qe5Q26qdpYVlIPYfQmba2MhUrr60Wb0cnTvkwm87tN+C+BGujyrkyuTl7/HIhQMehDWqQkoBgNNCD+XOT/TOHdo/vT2UapX9M0dUKDeu X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: 2024-03-08 01:08 UTC+0000 ~ Alexei Starovoitov > From: Andrii Nakryiko > > LLVM automatically places __arena variables into ".arena.1" ELF section. > In order to use such global variables bpf program must include definition > of arena map in ".maps" section, like: > struct { > __uint(type, BPF_MAP_TYPE_ARENA); > __uint(map_flags, BPF_F_MMAPABLE); > __uint(max_entries, 1000); /* number of pages */ > __ulong(map_extra, 2ull << 44); /* start of mmap() region */ > } arena SEC(".maps"); > > libbpf recognizes both uses of arena and creates single `struct bpf_map *` > instance in libbpf APIs. > ".arena.1" ELF section data is used as initial data image, which is exposed > through skeleton and bpf_map__initial_value() to the user, if they need to tune > it before the load phase. During load phase, this initial image is copied over > into mmap()'ed region corresponding to arena, and discarded. > > Few small checks here and there had to be added to make sure this > approach works with bpf_map__initial_value(), mostly due to hard-coded > assumption that map->mmaped is set up with mmap() syscall and should be > munmap()'ed. For arena, .arena.1 can be (much) smaller than maximum > arena size, so this smaller data size has to be tracked separately. > Given it is enforced that there is only one arena for entire bpf_object > instance, we just keep it in a separate field. This can be generalized > if necessary later. > > All global variables from ".arena.1" section are accessible from user space > via skel->arena->name_of_var. > > For bss/data/rodata the skeleton/libbpf perform the following sequence: > 1. addr = mmap(MAP_ANONYMOUS) > 2. user space optionally modifies global vars > 3. map_fd = bpf_create_map() > 4. bpf_update_map_elem(map_fd, addr) // to store values into the kernel > 5. mmap(addr, MAP_FIXED, map_fd) > after step 5 user spaces see the values it wrote at step 2 at the same addresses > > arena doesn't support update_map_elem. Hence skeleton/libbpf do: > 1. addr = malloc(sizeof SEC ".arena.1") > 2. user space optionally modifies global vars > 3. map_fd = bpf_create_map(MAP_TYPE_ARENA) > 4. real_addr = mmap(map->map_extra, MAP_SHARED | MAP_FIXED, map_fd) > 5. memcpy(real_addr, addr) // this will fault-in and allocate pages > > At the end look and feel of global data vs __arena global data is the same from > bpf prog pov. > > Another complication is: > struct { > __uint(type, BPF_MAP_TYPE_ARENA); > } arena SEC(".maps"); > > int __arena foo; > int bar; > > ptr1 = &foo; // relocation against ".arena.1" section > ptr2 = &arena; // relocation against ".maps" section > ptr3 = &bar; // relocation against ".bss" section > > Fo the kernel ptr1 and ptr2 has point to the same arena's map_fd > while ptr3 points to a different global array's map_fd. > For the verifier: > ptr1->type == unknown_scalar > ptr2->type == const_ptr_to_map > ptr3->type == ptr_to_map_value > > After verification, from JIT pov all 3 ptr-s are normal ld_imm64 insns. > > Signed-off-by: Andrii Nakryiko > Signed-off-by: Alexei Starovoitov > --- > tools/bpf/bpftool/gen.c | 13 +++++ > tools/lib/bpf/libbpf.c | 118 ++++++++++++++++++++++++++++++++++++---- > tools/lib/bpf/libbpf.h | 2 +- > 3 files changed, 120 insertions(+), 13 deletions(-) > > diff --git a/tools/bpf/bpftool/gen.c b/tools/bpf/bpftool/gen.c > index a3d72be347b0..4fa4ade1ce74 100644 > --- a/tools/bpf/bpftool/gen.c > +++ b/tools/bpf/bpftool/gen.c > @@ -120,6 +120,12 @@ static bool get_datasec_ident(const char *sec_name, char *buf, size_t buf_sz) > static const char *pfxs[] = { ".data", ".rodata", ".bss", ".kconfig" }; > int i, n; > > + /* recognize hard coded LLVM section name */ > + if (strcmp(sec_name, ".arena.1") == 0) { > + /* this is the name to use in skeleton */ > + snprintf(buf, buf_sz, "arena"); > + return true; > + } > for (i = 0, n = ARRAY_SIZE(pfxs); i < n; i++) { > const char *pfx = pfxs[i]; > > @@ -250,6 +256,13 @@ static const struct btf_type *find_type_for_map(struct btf *btf, const char *map > > static bool is_mmapable_map(const struct bpf_map *map, char *buf, size_t sz) > { > + size_t tmp_sz; > + > + if (bpf_map__type(map) == BPF_MAP_TYPE_ARENA && bpf_map__initial_value(map, &tmp_sz)) { > + snprintf(buf, sz, "arena"); > + return true; > + } > + > if (!bpf_map__is_internal(map) || !(bpf_map__map_flags(map) & BPF_F_MMAPABLE)) > return false; > For the bpftool changes: Acked-by: Quentin Monnet