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 89460C48260 for ; Wed, 14 Feb 2024 00:33:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 137918D0012; Tue, 13 Feb 2024 19:33:13 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 0C0D28D000E; Tue, 13 Feb 2024 19:33:13 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E7C8F8D0012; Tue, 13 Feb 2024 19:33:12 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id D5F9F8D000E for ; Tue, 13 Feb 2024 19:33:12 -0500 (EST) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 5B504803E6 for ; Wed, 14 Feb 2024 00:33:12 +0000 (UTC) X-FDA: 81788535024.03.67072E3 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) by imf28.hostedemail.com (Postfix) with ESMTP id 8C758C000C for ; Wed, 14 Feb 2024 00:33:10 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="l/Y49cUz"; spf=pass (imf28.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.128.54 as permitted sender) smtp.mailfrom=alexei.starovoitov@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1707870790; 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=0x2WNHiyjORQ3cesMvySm7mEwT4WaTJCyjtxON0pehY=; b=WfDNVYHTk/u2vDcdi7Kat4R1Kr3uOyspDxCH5Ea/nr3ZIlMOaxubdKeWSdxI16B0xkRPHJ 6naE5Xob2RWfiD0lvZrSeNuWm4UgHjqi6oIvmBnlbLxGBBUjTh+EKnBgLL2KxFOTUPQHiM 1vb69patQU3+nhTXe62Pts6SAAsV1EU= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="l/Y49cUz"; spf=pass (imf28.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.128.54 as permitted sender) smtp.mailfrom=alexei.starovoitov@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1707870790; a=rsa-sha256; cv=none; b=Pxtrn+gMO+mWklXMi/yjCASJ+9SisWGaGkoO+iA6xNorAMcWqqQ6FU0eNZS7b7tOBAWtYO RiRkZ2iqzdqfAiYAbP0hR0maCz8hAq+WyGKJ5rvRjWKhnJwzu1bGizJNCgUdFOU/eh0DlB nq9VXl3vfqIhVHpPIKodbidtjsCy4GQ= Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-411e698e679so704075e9.1 for ; Tue, 13 Feb 2024 16:33:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1707870789; x=1708475589; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=0x2WNHiyjORQ3cesMvySm7mEwT4WaTJCyjtxON0pehY=; b=l/Y49cUzBHENR6Dd0DL0Lw8OOrfwVr+5pfAkJtpgUJqygNkcquJwgdafdhSF2zpyOr Tye/d5/Pc9B4jTYFYL8PPbcCBuI+pskRbiIGQ/GUTehRGHaJon89Pk3g7qiEKXYvnUVJ mMZ0n/oxjr2Cr3ZGdGkQVdwEDsO9fODa0CG4m+AHbRwr50NNRSDBUJD500eSwsiVNKwW 4/HMvAfRvROTVcCp6s/7ofeaQXe64XPAKEA+Ls2zAjIqq47FHwUwjZl4FZk3GGTS/QyM gqs8Vel6zP1gTmWIMovB8df0c1rosOt8wqS2WaOIQechqPt0X6+P2EDf3yFsmFWqYkzR EQjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707870789; x=1708475589; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0x2WNHiyjORQ3cesMvySm7mEwT4WaTJCyjtxON0pehY=; b=WIxC60gKBBWSr2VuwFJJF5P6gAtuQCz9BbTCPR9l9aVcsAVvU265z0MCex1E+AdFV4 +kIXJZghR7lOKrhiQ8jYAx4riUnqnLNiRo4/RJQ2wLnRgE260mSIcrUnvLCjUF+7oY/3 h8r1M+sj4EUzMwN0AVgjeZxc1c4fXuv0G4DPxDk3S8pm5jojsen7VpLgyoE6iAERvG6c gF0kLsPijZGz5MiI9zcokqN+TOrMUyiRasxKFIx9UmT2X9v0vBBWZOAddAoRAjyyuyML bkMNxNmOE4U7y0xK/akqk14ZtKaW7RYgWGB74mz1siZSSomiduImzQf5LJyOrkLqYn2M MKNw== X-Forwarded-Encrypted: i=1; AJvYcCXKi5XJK2JzvB8bNOd1dJixLP7IiZqbtZiF3hU8ADTDyUq4cVMbSADdnjh/4wRhVRvZf9EV+JpsY6t0AyVneZWC12s= X-Gm-Message-State: AOJu0YxstANcLtSklU86w09C2utSBZPkFAXkd5Wo02/buh+VZWjDxvto hxSUupn2sDVGCM/FzJ1HTH1lmx21nTWf+XAIH3vTtxu9CNOQR7IzDSOeqRZZoHsNgsfdw9T+Yym Dp6u5AaMpswAVdrEpszBeRHCFP0s= X-Google-Smtp-Source: AGHT+IERYm7QlCAALmHKq5bz6Re3LbvIFvhGYHGcD1OHSZ8rFdDdFL6IBxFqsG8wKmI4jm8TgoedXgxzfw3e1J3v7ts= X-Received: by 2002:a5d:5505:0:b0:33c:deed:673d with SMTP id b5-20020a5d5505000000b0033cdeed673dmr499308wrv.21.1707870788925; Tue, 13 Feb 2024 16:33:08 -0800 (PST) MIME-Version: 1.0 References: <20240209040608.98927-1-alexei.starovoitov@gmail.com> <20240209040608.98927-13-alexei.starovoitov@gmail.com> In-Reply-To: From: Alexei Starovoitov Date: Tue, 13 Feb 2024 16:32:57 -0800 Message-ID: Subject: Re: [PATCH v2 bpf-next 12/20] libbpf: Add support for bpf_arena. To: Andrii Nakryiko Cc: bpf , Daniel Borkmann , Andrii Nakryiko , Kumar Kartikeya Dwivedi , Eddy Z , Tejun Heo , Barret Rhoden , Johannes Weiner , Lorenzo Stoakes , Andrew Morton , Uladzislau Rezki , Christoph Hellwig , linux-mm , Kernel Team Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: 8C758C000C X-Rspam-User: X-Stat-Signature: npuyzpmxg8w9yq9o8jsz48hrx4m4ibwi X-Rspamd-Server: rspam01 X-HE-Tag: 1707870790-414059 X-HE-Meta: U2FsdGVkX18/3/c3yF/M7xPKhc9F8+EfmZKnvm5He7/ABkFYNwzhBx2CUBruV7h4srfHlwt8wvqU67RgU7FTxlV3Yi5Oq4bUOD+43C1D4zDcKFj+QmcpSzhubtxpsmlJC45Fq57dpqeqGxwT+SOf6BuLZFKfoEYJFWvwniW9AQn8IH/MBNKNc9BBvwzVdfYZ38nYWObGrZXoAkQX7q+oV0H1j2l5EYG5WlpHb+D1/SXehzbyYofw8H5AEl6UTydbNIyRR0u/iwvuJANI601XRfkf7KCLVnfOkkFvDh6UVG9C2U0sMEMdUUxKX5KBkrHGICCk0PTYQHGLS2f99E+ziOLM9yTft9fyJZVpHe4S4ktmthWDIUOqdlFUZg6p5g0PzI9ulBsW5cl5oPqxyBLm3xT/FqgBm6ZblqADMcGz90hFNc9Bncaetl1O0GsRoLp6bxRoSBJZIl02ZY/mPpvKTPbrth2Dlt55HKeOE7/sWKPp2ckRdCljZ5KUJum09IL+AXh+hvWtj1dN8sv8GtvDauwm80x66WW4rHBad31TISm++jh84Uwg54etLpii3AgyTBxyUcYD9FHMqwuwvmHyN+gqbH/bgBB4kjOG4YOzbFg/6rLC7CYaQ1XtydsYPQ2+Qc52bWIjg74MW3F1exjSgwtZlhiVdSK2igQ6ULP84O//49b2UKb924Tnx4tH5PGlNMq2gZG7/GNQ7/SPzsIget3DGhRv7e+STdAF+xQnYYeTIgbPcMkk26AMULwgS8Hx4t4iMnd9Z0JbgydRq8Cx+rfXGePvLuUUXGtOb1EmmHUX2pS4nVRHVufWn6k5HtwEqQhOFqGP3reINyjwD13bQ8843DBKiL0Y6kCmyyqjDaU8KASM1Q/98IZdn+mVhlRwQbpCVx+2MF/K5rbuU2D4rV2NVzeHmwwDEMmYfsjcYmX5Po/qtEqq7lhqGoI4k5rIZUocA0mkCZvQCe2l/TC rEnIDLq3 q7dVUnJv4IYGYZrzKDm5vFf2q06aAgWrQApvTlzB/CYFva2UwakbDJW6jmH9epCji6BmhmdgDkEQgbrTbbq/mz1362E2+H7sV5Kx1LdvRAe4oLTeca2n7vNQt7r1sKPe2MHx3R0wE5MyimxuuiudJqyHjj3iYsjmJzKmeIl9qzfS8YN8uNyyPED1BhswJjJwlUtlZosJuy3G12ec8Fdh9JOpSXzctC3SSy41sW9ZL4A70lqWJFaleiOMYx8WOzRFvvV2THLxkKBKZzZ6YQW75Rfe883Yd1i/MCR6Rmbet9ZCNg/5NEHdNsTlejZRYNQWwFPCb/DoeANmr3nF0M61vdu7bBa3tQ3wePel9TF/cRlYH5ndO1cqY4CW8LVb0hZySehEPl3AzZrpgAVf7WXCMtSsDg22IeulFHe51wwI8mmxeiZJfQg3bN8nfZL84BJbEmUt+lwmmHpc6tCYOUeOJcpNVcPJJ6vLDEWy/DZAbDoIYvTm6kgDIJDTKUDrbs8Ugg0SaStLf5i31X9lh2uA6FJ1u1CqnqNLQVsbQfIb/fwF260DL0zvk5qlankdPFrAGEEiWxQM6wV1S/r0= 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: On Tue, Feb 13, 2024 at 3:15=E2=80=AFPM Andrii Nakryiko wrote: > > On Thu, Feb 8, 2024 at 8:07=E2=80=AFPM Alexei Starovoitov > wrote: > > > > From: Alexei Starovoitov > > > > mmap() bpf_arena right after creation, since the kernel needs to > > remember the address returned from mmap. This is user_vm_start. > > LLVM will generate bpf_arena_cast_user() instructions where > > necessary and JIT will add upper 32-bit of user_vm_start > > to such pointers. > > > > Fix up bpf_map_mmap_sz() to compute mmap size as > > map->value_size * map->max_entries for arrays and > > PAGE_SIZE * map->max_entries for arena. > > > > Don't set BTF at arena creation time, since it doesn't support it. > > > > Signed-off-by: Alexei Starovoitov > > --- > > tools/lib/bpf/libbpf.c | 43 ++++++++++++++++++++++++++++++----- > > tools/lib/bpf/libbpf_probes.c | 7 ++++++ > > 2 files changed, 44 insertions(+), 6 deletions(-) > > > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > > index 01f407591a92..4880d623098d 100644 > > --- a/tools/lib/bpf/libbpf.c > > +++ b/tools/lib/bpf/libbpf.c > > @@ -185,6 +185,7 @@ static const char * const map_type_name[] =3D { > > [BPF_MAP_TYPE_BLOOM_FILTER] =3D "bloom_filter", > > [BPF_MAP_TYPE_USER_RINGBUF] =3D "user_ringbuf", > > [BPF_MAP_TYPE_CGRP_STORAGE] =3D "cgrp_storage", > > + [BPF_MAP_TYPE_ARENA] =3D "arena", > > }; > > > > static const char * const prog_type_name[] =3D { > > @@ -1577,7 +1578,7 @@ static struct bpf_map *bpf_object__add_map(struct= bpf_object *obj) > > return map; > > } > > > > -static size_t bpf_map_mmap_sz(unsigned int value_sz, unsigned int max_= entries) > > +static size_t __bpf_map_mmap_sz(unsigned int value_sz, unsigned int ma= x_entries) > > please rename this to array_map_mmap_sz, underscores are not very meaning= ful makes sense. > > { > > const long page_sz =3D sysconf(_SC_PAGE_SIZE); > > size_t map_sz; > > @@ -1587,6 +1588,20 @@ static size_t bpf_map_mmap_sz(unsigned int value= _sz, unsigned int max_entries) > > return map_sz; > > } > > > > +static size_t bpf_map_mmap_sz(const struct bpf_map *map) > > +{ > > + const long page_sz =3D sysconf(_SC_PAGE_SIZE); > > + > > + switch (map->def.type) { > > + case BPF_MAP_TYPE_ARRAY: > > + return __bpf_map_mmap_sz(map->def.value_size, map->def.= max_entries); > > + case BPF_MAP_TYPE_ARENA: > > + return page_sz * map->def.max_entries; > > + default: > > + return 0; /* not supported */ > > + } > > +} > > + > > static int bpf_map_mmap_resize(struct bpf_map *map, size_t old_sz, siz= e_t new_sz) > > { > > void *mmaped; > > @@ -1740,7 +1755,7 @@ bpf_object__init_internal_map(struct bpf_object *= obj, enum libbpf_map_type type, > > pr_debug("map '%s' (global data): at sec_idx %d, offset %zu, fl= ags %x.\n", > > map->name, map->sec_idx, map->sec_offset, def->map_fla= gs); > > > > - mmap_sz =3D bpf_map_mmap_sz(map->def.value_size, map->def.max_e= ntries); > > + mmap_sz =3D bpf_map_mmap_sz(map); > > map->mmaped =3D mmap(NULL, mmap_sz, PROT_READ | PROT_WRITE, > > MAP_SHARED | MAP_ANONYMOUS, -1, 0); > > if (map->mmaped =3D=3D MAP_FAILED) { > > @@ -4852,6 +4867,7 @@ static int bpf_object__create_map(struct bpf_obje= ct *obj, struct bpf_map *map, b > > case BPF_MAP_TYPE_SOCKHASH: > > case BPF_MAP_TYPE_QUEUE: > > case BPF_MAP_TYPE_STACK: > > + case BPF_MAP_TYPE_ARENA: > > create_attr.btf_fd =3D 0; > > create_attr.btf_key_type_id =3D 0; > > create_attr.btf_value_type_id =3D 0; > > @@ -4908,6 +4924,21 @@ static int bpf_object__create_map(struct bpf_obj= ect *obj, struct bpf_map *map, b > > if (map->fd =3D=3D map_fd) > > return 0; > > > > + if (def->type =3D=3D BPF_MAP_TYPE_ARENA) { > > + map->mmaped =3D mmap((void *)map->map_extra, bpf_map_mm= ap_sz(map), > > + PROT_READ | PROT_WRITE, > > + map->map_extra ? MAP_SHARED | MAP_FI= XED : MAP_SHARED, > > + map_fd, 0); > > + if (map->mmaped =3D=3D MAP_FAILED) { > > + err =3D -errno; > > + map->mmaped =3D NULL; > > + close(map_fd); > > + pr_warn("map '%s': failed to mmap bpf_arena: %d= \n", > > + bpf_map__name(map), err); > > seems like we just use `map->name` directly elsewhere in this > function, let's keep it consistent that was to match the next patch, since arena is using real_name. map->name is also correct and will have the same name here. The next patch will have two arena maps, but one will never be passed into this function to create a real kernel map. So I can use map->name here, but bpf_map__name() is a bit more correct. > > + return err; > > + } > > + } > > + > > /* Keep placeholder FD value but now point it to the BPF map ob= ject. > > * This way everything that relied on this map's FD (e.g., relo= cated > > * ldimm64 instructions) will stay valid and won't need adjustm= ents. > > @@ -8582,7 +8613,7 @@ static void bpf_map__destroy(struct bpf_map *map) > > if (map->mmaped) { > > size_t mmap_sz; > > > > - mmap_sz =3D bpf_map_mmap_sz(map->def.value_size, map->d= ef.max_entries); > > + mmap_sz =3D bpf_map_mmap_sz(map); > > munmap(map->mmaped, mmap_sz); > > map->mmaped =3D NULL; > > } > > @@ -9830,8 +9861,8 @@ int bpf_map__set_value_size(struct bpf_map *map, = __u32 size) > > int err; > > size_t mmap_old_sz, mmap_new_sz; > > > > this logic assumes ARRAY (which are the only ones so far that could > have `map->mapped !=3D NULL`, so I think we should error out for ARENA > maps here, instead of silently doing the wrong thing? > > if (map->type !=3D BPF_MAP_TYPE_ARRAY) > return -EOPNOTSUPP; > > should do Good point. Will do.