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 B2240C48260 for ; Tue, 13 Feb 2024 23:15:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 455688D001E; Tue, 13 Feb 2024 18:15:33 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 405A38D000E; Tue, 13 Feb 2024 18:15:33 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2A6A58D001E; Tue, 13 Feb 2024 18:15:33 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 170208D000E for ; Tue, 13 Feb 2024 18:15:33 -0500 (EST) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id D9FAE40186 for ; Tue, 13 Feb 2024 23:15:32 +0000 (UTC) X-FDA: 81788339304.28.F7C8589 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) by imf12.hostedemail.com (Postfix) with ESMTP id E5B2440016 for ; Tue, 13 Feb 2024 23:15:30 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=j83vFS74; spf=pass (imf12.hostedemail.com: domain of andrii.nakryiko@gmail.com designates 209.85.210.180 as permitted sender) smtp.mailfrom=andrii.nakryiko@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=1707866131; 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=1FjMl53jj5jAc1ILn2Q5wZSM5Pt3OeETnKsZC2xWPYg=; b=uMOdQHI5OYPgwhTkMZ+YdvLytZyyJ4iCM1kk6Goo0EEfjsVxMqpOrVXvaf9eWgDUOQLxqG Aw0Wg8CnYBnO0JnfPuEMh4dSrF9c8HeOApEUS1usQlkeHmy6kqXnwpB3f+4n/XbZxgloHq FFGzVDkVlXA7rEkx82RPnSiQx6gr0/o= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1707866131; a=rsa-sha256; cv=none; b=m3JwhkdaS8Fcz61ZMmD7q+EnxmprxXJF0vBjGaGD0e57q2UMLC6yB4+roFUDJtwit8K/y1 1tKdjO37DuKe0dUNgiQTUZR6mufnUw3wsXIpGDesvcFOL4kUJq3nN4B8wMZHIPD8PXX3q0 IFZ5Mzj3082AA2hnaRerVeABcoh337E= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=j83vFS74; spf=pass (imf12.hostedemail.com: domain of andrii.nakryiko@gmail.com designates 209.85.210.180 as permitted sender) smtp.mailfrom=andrii.nakryiko@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-6da6b0eb2d4so3642204b3a.1 for ; Tue, 13 Feb 2024 15:15:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1707866130; x=1708470930; 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=1FjMl53jj5jAc1ILn2Q5wZSM5Pt3OeETnKsZC2xWPYg=; b=j83vFS74bfaf0+S9dR74mDthJHYQIejYgYfNVf9vxAA0gieD5oQ1dyh14MOY/OSZTa tm4mecF7PaxkrIsoY/JwnKnJn5wux4QhfPzVYFzB6VxH40RLN4qlZ3npBo9kNSJdDWJq 782Vt98Zx5Lrs9vhIZOzBj1WEnL68GVyY9v90/BperaImfIhNYbIEO9MqjayDqyT7TyV QT0rfKddBsT6hWGzHeJZ9v/CPl23dWyN0LGiQF4OrwFEjN53gqB3RDnlL/CpiM1gMhzI F3uwmYgdScZxTpnuaUsksTYK2YAoFjO94gZYuHsmIzRI8+bhBLTAx0rxH92Nq8a+9JiK Ieag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707866130; x=1708470930; 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=1FjMl53jj5jAc1ILn2Q5wZSM5Pt3OeETnKsZC2xWPYg=; b=MEKLbq7GL/dzib3aj/9BbN8birwhuLZJ6J0h5OVecuh6OgGapvMxNup/GorDqlGWWF HYYCRkX1PZX04eFzgSmRUYpWhoZ6czbLXq1b4i1dIZuXqr22G81ePPVWhmekV8TOCFZ/ DsGIVSsdbUH8JQF7DeWAZLrzQuctVYz0fWQ9249xAzFan/JPHNzVjlqljUxJcgqjmhRC KsZh3ZF4JRAAeXdPXY3hEPe3qfRL1IdiiMcCaD6tCvi9eG8Q0F1Suq75K+n6r6W/tzE0 xiBCFc5EPlVlPIAED2D7f8n59pHdk5wAF1s8NQjSoKLFfE8DZcik+SJ6EizpY5bUUgrh GOGQ== X-Forwarded-Encrypted: i=1; AJvYcCVmhptt3J3cwI7+YLBsOW7wLO5fGlcSIxyKpXnONSgvgh8bxrjGcwrKXpTsdFVrmoOloTZlX+TWp2FzTyBCc88rAvE= X-Gm-Message-State: AOJu0YzIsRAF+DAs3m/WjaWZeHrmIt/Dhh8hgeG8HP1eFFprJEr7tN2s 6ZHU2uvmwel/QuM1p00Me5DjhAJQYnIyKTsA7SDFAyMD5IHrzJnNl5CnL1fPCugM69ftTvETMUg w4p0KuP1hPxz4ksaMnejvhIoY3I8= X-Google-Smtp-Source: AGHT+IFCce3myqJYkM+YRe6itlN73YMcHSHi23KchJiDtio4ufNcI2QRdFLEzB64BKcF5fh0UjifkDQj+iwnqWLuLSM= X-Received: by 2002:a05:6a21:1585:b0:19e:bd3e:76e1 with SMTP id nr5-20020a056a21158500b0019ebd3e76e1mr1265023pzb.48.1707866129699; Tue, 13 Feb 2024 15:15:29 -0800 (PST) MIME-Version: 1.0 References: <20240209040608.98927-1-alexei.starovoitov@gmail.com> <20240209040608.98927-13-alexei.starovoitov@gmail.com> In-Reply-To: <20240209040608.98927-13-alexei.starovoitov@gmail.com> From: Andrii Nakryiko Date: Tue, 13 Feb 2024 15:15:17 -0800 Message-ID: Subject: Re: [PATCH v2 bpf-next 12/20] libbpf: Add support for bpf_arena. To: Alexei Starovoitov Cc: bpf@vger.kernel.org, daniel@iogearbox.net, andrii@kernel.org, memxor@gmail.com, eddyz87@gmail.com, tj@kernel.org, brho@google.com, hannes@cmpxchg.org, lstoakes@gmail.com, akpm@linux-foundation.org, urezki@gmail.com, hch@infradead.org, linux-mm@kvack.org, kernel-team@fb.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: E5B2440016 X-Rspam-User: X-Stat-Signature: 44899fgkqo3woncem3grbqsmzk9uktn9 X-Rspamd-Server: rspam03 X-HE-Tag: 1707866130-270961 X-HE-Meta: U2FsdGVkX1/Wi7UfZ/lVZAdkZ1ICH8/knu5FoijXi25CCr0UjK0HfO9iWbDacdwbiGeSyU94x8ohefrRsM19GJrzAXZciK1cc+txG5b9gRAiKY4SdxNFcEbAgQCtZpNGthrAt8SszyvzMjFXlhbmnSOidAEPHkTtVONLZX0V7UAX7F4gcLHA2O+WMDDlyCeGG9I3VwPHwtt7UH+wf5jkyjMRy1lN2G91snbYidy3yHkem3sEZsAjRBVzMv16/KVWm9w8O+Hn51MbGr89YdvdZeCpzb6yE9gjSroVecHldxZLw5LnQfCxMc4lLLIgKlD/UpBwpdo3Ztkp/zWj/tKINvvWmpYS92MVYtDwymumvKwdofECOn1Mf5TN/k2RBEq1/ZVpUTEe+/jt28IZXvSeF7QS0mjIlYcupuRIz7epz5358Q6CAxqluRS1Ov6cklpAlYnCy3PoJHWE37jCdSCEgSd1W7jcbeJO5RCJ72dMWqAoYo3mXNI12MzNcIz7kMyQW0JClT8rpNSwW2DOk57d2jCdzlCARm9QzEY600J+sj/aOZ81eiNiwlUSsunrmIN+ZegFLenPAnAiZ8gnaaJwbAmstIs2NKutO6QQE/P/sNVPOBAhL5PljUdE/6/ajL1iqHMGbzo9dKcvPFSfjauJoyvkbOjBZv+4ZxvC9SwAbyyTGzWBRfaQaz4oJ5E+Rq4gwkiVfogvdyEWfa+oSGZp4DZQ4UqUFuONgzHy9lfwnuZFz4iSUB+oBW9sq68WvnaJSdoF262/GxX6op622ofjdCxlqjCXzltL8gvmfIjuc2IFL7gEc9GKQrOI8ke24FH8yfjnoUehVJZVZhzAusuElOTSE7ak5uNHkSOkO7Bi7kpbynZVCvQF6Uz6UMw4nemx+A6U8FBXqMQyUS8mFePzdxCxKDuG0QMBB03oeCBLZZnDAeLs4B7xs7qJuGMiBOjNENIp10RHxwaxmO6MqmG kbgAmc58 6FneHcaP5kSL2R4B6iv8UmXXaADLfxcGR/OODzt5XgN5NKlI/w1enmZJ2PfCnOnP+5dnPC70mZJYbQXxi1CVGjZFmEntmeLC4lmJAvugUHOXxnTElm8+f7ifBTI3CixY7Lh2xwXz+a5QEcD93HGmu+/sWLyuSYhEuTkOoKhgZKxs2dWTHYQ2gZkWx0lG3Ch+YtdAi9pd5RD9J5ofNe5nkx/QXdXQfVEMiMrk3PIbdgb55UQ7v558WgmPrTbPz+pfboqHHQ3iQj39v5ol1z0RJC4JnYe2ieu0X65xGceYZpZNZXS9QIMOCHTL3XU8v5NU2EOcsOY6FT7Jg8BFv7JC1A8kndK/R+uYttqVz+FCyMgcahg5IzKl0AxKs5tLKuhBkpaSEp6KT4cvrP/PZbZR3FuT/2b0VjvLHK5cjZ5Jkx9NCR9HjLI51njSQw1z8Xtga8xXEUgcgirutPVM6zeqsUdgd477W+s6c7Cks9bJC/+qeFw0Rv/TGOThbPI79p/j8e8ko05xw5q/+RWl0hwKOW8cCM9wvCgRSp3Jd8jXQC+rE7EQjAasho3GR7De0FB+WhxVHDDTV21s2ASc67ETRav1hFQ== 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 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 b= pf_object *obj) > return map; > } > > -static size_t bpf_map_mmap_sz(unsigned int value_sz, unsigned int max_en= tries) > +static size_t __bpf_map_mmap_sz(unsigned int value_sz, unsigned int max_= entries) please rename this to array_map_mmap_sz, underscores are not very meaningfu= l > { > 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_s= z, 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.ma= x_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, size_= t new_sz) > { > void *mmaped; > @@ -1740,7 +1755,7 @@ bpf_object__init_internal_map(struct bpf_object *ob= j, enum libbpf_map_type type, > pr_debug("map '%s' (global data): at sec_idx %d, offset %zu, flag= s %x.\n", > map->name, map->sec_idx, map->sec_offset, def->map_flags= ); > > - mmap_sz =3D bpf_map_mmap_sz(map->def.value_size, map->def.max_ent= ries); > + 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_object= *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_objec= t *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_mmap= _sz(map), > + PROT_READ | PROT_WRITE, > + map->map_extra ? MAP_SHARED | MAP_FIXE= D : 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 > + return err; > + } > + } > + > /* Keep placeholder FD value but now point it to the BPF map obje= ct. > * This way everything that relied on this map's FD (e.g., reloca= ted > * ldimm64 instructions) will stay valid and won't need adjustmen= ts. > @@ -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->def= .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 > - mmap_old_sz =3D bpf_map_mmap_sz(map->def.value_size, map-= >def.max_entries); > - mmap_new_sz =3D bpf_map_mmap_sz(size, map->def.max_entrie= s); > + mmap_old_sz =3D bpf_map_mmap_sz(map); > + mmap_new_sz =3D __bpf_map_mmap_sz(size, map->def.max_entr= ies); > err =3D bpf_map_mmap_resize(map, mmap_old_sz, mmap_new_sz= ); > if (err) { > pr_warn("map '%s': failed to resize memory-mapped= region: %d\n", > @@ -13356,7 +13387,7 @@ int bpf_object__load_skeleton(struct bpf_object_s= keleton *s) > > for (i =3D 0; i < s->map_cnt; i++) { > struct bpf_map *map =3D *s->maps[i].map; > - size_t mmap_sz =3D bpf_map_mmap_sz(map->def.value_size, m= ap->def.max_entries); > + size_t mmap_sz =3D bpf_map_mmap_sz(map); > int prot, map_fd =3D map->fd; > void **mmaped =3D s->maps[i].mmaped; > > diff --git a/tools/lib/bpf/libbpf_probes.c b/tools/lib/bpf/libbpf_probes.= c > index ee9b1dbea9eb..302188122439 100644 > --- a/tools/lib/bpf/libbpf_probes.c > +++ b/tools/lib/bpf/libbpf_probes.c > @@ -338,6 +338,13 @@ static int probe_map_create(enum bpf_map_type map_ty= pe) > key_size =3D 0; > max_entries =3D 1; > break; > + case BPF_MAP_TYPE_ARENA: > + key_size =3D 0; > + value_size =3D 0; > + max_entries =3D 1; /* one page */ > + opts.map_extra =3D 0; /* can mmap() at any address */ > + opts.map_flags =3D BPF_F_MMAPABLE; > + break; > case BPF_MAP_TYPE_HASH: > case BPF_MAP_TYPE_ARRAY: > case BPF_MAP_TYPE_PROG_ARRAY: > -- > 2.34.1 >