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 BCC26C48297 for ; Fri, 9 Feb 2024 16:57:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 19C786B0071; Fri, 9 Feb 2024 11:57:52 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 14CC96B0072; Fri, 9 Feb 2024 11:57:52 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 014FC6B0074; Fri, 9 Feb 2024 11:57:51 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id E89DF6B0071 for ; Fri, 9 Feb 2024 11:57:51 -0500 (EST) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 776F5120F9C for ; Fri, 9 Feb 2024 16:57:51 +0000 (UTC) X-FDA: 81772872342.21.B4CD91D Received: from mail-qk1-f171.google.com (mail-qk1-f171.google.com [209.85.222.171]) by imf14.hostedemail.com (Postfix) with ESMTP id 98B79100010 for ; Fri, 9 Feb 2024 16:57:49 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf14.hostedemail.com: domain of dcvernet@gmail.com designates 209.85.222.171 as permitted sender) smtp.mailfrom=dcvernet@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1707497869; 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: in-reply-to:in-reply-to:references:references; bh=aG6KHSkq2vVo/go4bIeARSJ2dQsFSsB9TwMm+EEehbk=; b=Eiqv51iqpQeUKjYyjYZxLmBMaMFPSyWJXwOrAI0DEyRj7CV2/bmz8OZ9TvpmgVdJ9CllmG vAzwQeOMWgnI9GwJtKYhuBFersqXN+4zC4esH+3S7UUTs88F6/X75ZoQ7usRdm7rda70Es acAu6jvMmhPGo6BvnmzxwDVPA2IwzPE= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf14.hostedemail.com: domain of dcvernet@gmail.com designates 209.85.222.171 as permitted sender) smtp.mailfrom=dcvernet@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1707497869; a=rsa-sha256; cv=none; b=mCiiyPjdY2Gl1axFSPs88iZiIv6RaarcO9VYBcBMcxu4ayxgb40rsVxgm57rAjfzYG8v7m wL0wWmJ32kA+GN4loq97Mo8ce4FmapMU8pHSGrCOC3dMB6kZqo2SOROTeLNiPQ64hKJayv T9Smv0g0z3Pdpv7pQVIBu+aLkVF2kAg= Received: by mail-qk1-f171.google.com with SMTP id af79cd13be357-783f27300b1so48004085a.1 for ; Fri, 09 Feb 2024 08:57:49 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707497869; x=1708102669; h=user-agent:in-reply-to:content-disposition:mime-version:references :message-id:subject:cc:to:from:date:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aG6KHSkq2vVo/go4bIeARSJ2dQsFSsB9TwMm+EEehbk=; b=mZ4IbFyq7luH4+J23ssznHoWCq79jmA+VKsal2D4XdDndI1vxcva86mqtHU2VjdOWc evJpDnR/cZXOLUwSQUHY/bZCHXX4Vs1Om81Gkp+Y/fvO19iFGFc8KKlQZvUdix2jYuDV i/1E1mm9dko3gSryvodPjBLq0t37m2e0Oxt7e75Gj43jwmRKWZzVL9L/26cwVW/Z9hi3 GYGAd2clOThWUnkBHqQfeRaxrUEXgbBybRAlx1X8u7dEG1cTFm8GSdqqyLb0njVnsGip MM9Be2F88eKHitrFkfUWoyFa6CnGM27bQI0gZUei5NUl/CiXYr16baCHPOgRy4vwzWJW 1YUQ== X-Gm-Message-State: AOJu0YxnPW4LA71CVWuHd5/jDMiSCOKo4GgJyB4N/Mmq7XeDHPxPH0xo zc455q0QzNdPTf608HJoVP0Ri5SyX3Moqz/pByw5skE9pEq3AiSm X-Google-Smtp-Source: AGHT+IFb5FT5WZzOZjpBJvkWwuz8byiSf1norw9lAVDsTJi55VC5fjj7tPtas+/ZkYthxb1HPKd84Q== X-Received: by 2002:a05:620a:90a:b0:785:8e15:ccdc with SMTP id v10-20020a05620a090a00b007858e15ccdcmr1908566qkv.74.1707497868593; Fri, 09 Feb 2024 08:57:48 -0800 (PST) X-Forwarded-Encrypted: i=1; AJvYcCXCFSy3Rgydf9qVXaC1qYHEWGNTOkUxhfCxVNVuLFTrEu5NNDDzRhn0cbkyoQYxeHBWoKqaivwgrSlajiOsnF36SjPIqaHMj2iN5Aak/CJyK0elQHIBpSGVUTonHRfiPSFKynXsA6i0bUE06h/TIaBnN/8HzVPDIhKpjJlM/UdkSh4T600SM6N69j8YA8X4tw5TOzsLQVgw3sn5N0ZCq0RDGxkUY9Soi//h1JEqnfnUUdTVpOy96/EwdCzOaVGd0LHcTmOMkUD/Z3RYjTaA6FI+d9bOkvo2n+MxUlO0gx9CZU03umLYx2hUgoviISA7AA== Received: from maniforge.lan (c-24-1-27-177.hsd1.il.comcast.net. [24.1.27.177]) by smtp.gmail.com with ESMTPSA id vw16-20020a05620a565000b0078575747a18sm871084qkn.30.2024.02.09.08.57.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Feb 2024 08:57:48 -0800 (PST) Date: Fri, 9 Feb 2024 10:57:45 -0600 From: David Vernet To: Alexei Starovoitov Cc: bpf@vger.kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@kernel.org, memxor@gmail.com, eddyz87@gmail.com, tj@kernel.org, brho@google.com, hannes@cmpxchg.org, linux-mm@kvack.org, kernel-team@fb.com Subject: Re: [PATCH bpf-next 02/16] bpf: Recognize '__map' suffix in kfunc arguments Message-ID: <20240209165745.GB975217@maniforge.lan> References: <20240206220441.38311-1-alexei.starovoitov@gmail.com> <20240206220441.38311-3-alexei.starovoitov@gmail.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="Eova/GuUNfBAodRg" Content-Disposition: inline In-Reply-To: <20240206220441.38311-3-alexei.starovoitov@gmail.com> User-Agent: Mutt/2.2.12 (2023-09-09) X-Rspamd-Queue-Id: 98B79100010 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: j58stcd75iyxrt8ngi3zddyk8cmhhgfr X-HE-Tag: 1707497869-371256 X-HE-Meta: U2FsdGVkX18Mc8hZ4GcDKWHqj/iKSGm0LWiK74JdAfmqvPU/gddTfdsBlbM5hE6HL4mqvVu+/BIlUM8lu013R/NNDorhfXV15Q/8nRBQQrcUcDksulah189F+Z9ZL42pgNpgDAtM1/PxPThzr3Q8fonl+4Me7eFuM8O0yxaoYdorzvtVeSw0x7w2Kfu6m28NuhQLPbDmTjrMj7hjCGDmxobiyjuBxphwFu2xVX2RxFso/W8rOR+nE9jf/KdIyqhJEx0/kO6xfeHhuQ5HzZX2ac1XzCn8Wp8XTt3cc0ceefuD5gSeEjG+0nOQ/grMZNu3vGn2yO+Gt3imjZARnPbcJPJlvwdLGn+QmahINfeiWcAPLcVIQZrW+QYdyjd+5a2myiV+u3oVI+76PGOEpgUQ0GZFXczzp1X4VDsN8DxB1/qf63oOjbExbQKdvbBox4pB03IQt6yKPkKZzytTIwdUWXdShtLu9ZfX2wMywW6LqpULVNk5LsIwfC0eU1BnU7k9MBJCpXTfQVlroEjfQdtmNCl/pK8Xi1tBpIwNp/lsyfE3Gp8bUI5wr1blNisZSMqaDWuL+k4q9PvLJmeN9HH64UFMt1wxIwTDgLdIDpDqziMhnTobtU892m2Ox+qBMrTAZ7NCvV94Ua76ih75n64x0zzAfLYD32s3SlPbZ2f9M0KVHatus2yaj5s6xHK2IWtove8twM0lSPbss3Rx5gPAD42UqQuj0spKz4hQJ9yWK8146KNCkM/dxjGdMfb/L3CPK/YrThuUXbiFtN05dLJ8QkO9bb9DEyMfpM1ia8MUpwsDa1rWK3Tw0wuHWukMVL4200rX0lUorDnkfXsmRA+47erjz8P8qIBG6HTFv8U0bn8uOvAH1PbqAkTyromWeqZX+tYGefpJXcJajfUk1tw/Tx3FfbeXTKkPbuWj9T4X0f2q1OcRv4xrQzMLnC1kD96+lLG8g7Qwk71dz1F4nfK J1MKVVAr uiTlERttvcb8EZnXaEKDjSZCSV2q2ww4cJcLjyYu9mh5aZq0CkGPLm1WhPIKXIUkDWgmoIok3R3ij/u6Al3UpnUrINjuzVQOSrU4JV0rJNK7v+L6JIIUFFGJE2gg0Cxvo6q5aSSy7nflY+DxY5zJRQlehTKEZV9agECJUONZCNlDtmC4FZUkc/iHnNk6j2EyHTvtPHW3H+8gtiArifiHlhq8v3Zzv0VQQHOnGXUrlspuenk8VpsSbunQGdb1GTWupnpGVj3Y/99Hw7XpkXYXHyTQFY/aISHGWZbg/uFVMAZ3Q2UcZBIMFhf9LT/jCK1W/NQj26L0fqXeLS8k+U9Sy0vGcoA8hxvhXpcyr5omytGTVUVNl4QFWrQ8jUmGMgQd0OjELCVkszIxx9HWdle2klszxUA6pSXsv5G1qAhEV26TfG73A0k+hVuvpSHFeePfZCpwt3z3OMOgBFwXtFa9h42PQnWzFfQz0jYKLVyQM5OPL8xPw+ocE8Oy2ftrH76wqLmfkWfxFzm4yadWy0Y4tkHFvYfeEoehNllWA72h5htRuYRhnnFOufD/xUATV01bX3l5YrBnzTIax510/oNp6NiXc7YRLw5x2O57K8Oj9z2IQld6G0rigEXzadM0nAZ6FXUsq 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: --Eova/GuUNfBAodRg Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Feb 06, 2024 at 02:04:27PM -0800, Alexei Starovoitov wrote: > From: Alexei Starovoitov >=20 > Recognize 'void *p__map' kfunc argument as 'struct bpf_map *p__map'. > It allows kfunc to have 'void *' argument for maps, since bpf progs > will call them as: > struct { > __uint(type, BPF_MAP_TYPE_ARENA); > ... > } arena SEC(".maps"); >=20 > bpf_kfunc_with_map(... &arena ...); >=20 > Underneath libbpf will load CONST_PTR_TO_MAP into the register via ld_imm= 64 insn. > If kfunc was defined with 'struct bpf_map *' it would pass > the verifier, but bpf prog would need to use '(void *)&arena'. > Which is not clean. >=20 > Signed-off-by: Alexei Starovoitov > --- > kernel/bpf/verifier.c | 14 +++++++++++++- > 1 file changed, 13 insertions(+), 1 deletion(-) >=20 > diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c > index d9c2dbb3939f..db569ce89fb1 100644 > --- a/kernel/bpf/verifier.c > +++ b/kernel/bpf/verifier.c > @@ -10741,6 +10741,11 @@ static bool is_kfunc_arg_ignore(const struct btf= *btf, const struct btf_param *a > return __kfunc_param_match_suffix(btf, arg, "__ign"); > } > =20 > +static bool is_kfunc_arg_map(const struct btf *btf, const struct btf_par= am *arg) > +{ > + return __kfunc_param_match_suffix(btf, arg, "__map"); > +} > + > static bool is_kfunc_arg_alloc_obj(const struct btf *btf, const struct b= tf_param *arg) > { > return __kfunc_param_match_suffix(btf, arg, "__alloc"); > @@ -11064,7 +11069,7 @@ get_kfunc_ptr_arg_type(struct bpf_verifier_env *e= nv, > return KF_ARG_PTR_TO_CONST_STR; > =20 > if ((base_type(reg->type) =3D=3D PTR_TO_BTF_ID || reg2btf_ids[base_type= (reg->type)])) { > - if (!btf_type_is_struct(ref_t)) { > + if (!btf_type_is_struct(ref_t) && !btf_type_is_void(ref_t)) { > verbose(env, "kernel function %s args#%d pointer type %s %s is not su= pported\n", > meta->func_name, argno, btf_type_str(ref_t), ref_tname); > return -EINVAL; > @@ -11660,6 +11665,13 @@ static int check_kfunc_args(struct bpf_verifier_= env *env, struct bpf_kfunc_call_ > if (kf_arg_type < 0) > return kf_arg_type; > =20 > + if (is_kfunc_arg_map(btf, &args[i])) { > + /* If argument has '__map' suffix expect 'struct bpf_map *' */ > + ref_id =3D *reg2btf_ids[CONST_PTR_TO_MAP]; > + ref_t =3D btf_type_by_id(btf_vmlinux, ref_id); > + ref_tname =3D btf_name_by_offset(btf, ref_t->name_off); > + } This is fine, but given that this should only apply to KF_ARG_PTR_TO_BTF_ID, this seems a bit cleaner, wdyt? index ddaf09db1175..998da8b302ac 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -10741,6 +10741,11 @@ static bool is_kfunc_arg_ignore(const struct btf *= btf, const struct btf_param *a return __kfunc_param_match_suffix(btf, arg, "__ign"); } +static bool is_kfunc_arg_map(const struct btf *btf, const struct btf_param= *arg) +{ + return __kfunc_param_match_suffix(btf, arg, "__map"); +} + static bool is_kfunc_arg_alloc_obj(const struct btf *btf, const struct btf= _param *arg) { return __kfunc_param_match_suffix(btf, arg, "__alloc"); @@ -10910,6 +10915,7 @@ enum kfunc_ptr_arg_type { KF_ARG_PTR_TO_RB_NODE, KF_ARG_PTR_TO_NULL, KF_ARG_PTR_TO_CONST_STR, + KF_ARG_PTR_TO_MAP, /* pointer to a struct bpf_map */ }; enum special_kfunc_type { @@ -11064,12 +11070,12 @@ get_kfunc_ptr_arg_type(struct bpf_verifier_env *e= nv, return KF_ARG_PTR_TO_CONST_STR; if ((base_type(reg->type) =3D=3D PTR_TO_BTF_ID || reg2btf_ids[base_= type(reg->type)])) { - if (!btf_type_is_struct(ref_t)) { + if (!btf_type_is_struct(ref_t) && !btf_type_is_void(ref_t))= { verbose(env, "kernel function %s args#%d pointer ty= pe %s %s is not supported\n", meta->func_name, argno, btf_type_str(ref_t)= , ref_tname); return -EINVAL; } - return KF_ARG_PTR_TO_BTF_ID; + return is_kfunc_arg_map(meta->btf, &args[argno]) ? KF_ARG_P= TR_TO_MAP : KF_ARG_PTR_TO_BTF_ID; } if (is_kfunc_arg_callback(env, meta->btf, &args[argno])) @@ -11663,6 +11669,7 @@ static int check_kfunc_args(struct bpf_verifier_env= *env, struct bpf_kfunc_call_ switch (kf_arg_type) { case KF_ARG_PTR_TO_NULL: continue; + case KF_ARG_PTR_TO_MAP: case KF_ARG_PTR_TO_ALLOC_BTF_ID: case KF_ARG_PTR_TO_BTF_ID: if (!is_kfunc_trusted_args(meta) && !is_kfunc_rcu(m= eta)) @@ -11879,6 +11886,13 @@ static int check_kfunc_args(struct bpf_verifier_en= v *env, struct bpf_kfunc_call_ if (ret < 0) return ret; break; + case KF_ARG_PTR_TO_MAP: + /* If argument has '__map' suffix expect 'struct bp= f_map *' */ + ref_id =3D *reg2btf_ids[CONST_PTR_TO_MAP]; + ref_t =3D btf_type_by_id(btf_vmlinux, ref_id); + ref_tname =3D btf_name_by_offset(btf, ref_t->name_o= ff); + + fallthrough; case KF_ARG_PTR_TO_BTF_ID: /* Only base_type is checked, further checks are do= ne here */ if ((base_type(reg->type) !=3D PTR_TO_BTF_ID || > + > switch (kf_arg_type) { > case KF_ARG_PTR_TO_NULL: > continue; > --=20 > 2.34.1 >=20 >=20 --Eova/GuUNfBAodRg Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQRBxU1So5MTLwphjdFZ5LhpZcTzZAUCZcZZiQAKCRBZ5LhpZcTz ZIRqAP9RMb4YEZxJeCZzub6P8wiByjfmccyYJrlrT+8/m2Qs+gEAt3Y16on7fQjH qv6BC/gomkKKj5TpNzs+nAlSjIILlQw= =zDKM -----END PGP SIGNATURE----- --Eova/GuUNfBAodRg--