From mboxrd@z Thu Jan 1 00:00:00 1970 From: Song Liu Subject: Re: [PATCH bpf-next 3/6] bpf: btf: Add struct bpf_btf_info Date: Tue, 8 May 2018 21:09:58 +0000 Message-ID: References: <20180504214955.1058805-1-kafai@fb.com> <20180504214955.1058805-4-kafai@fb.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Cc: "netdev@vger.kernel.org" , Alexei Starovoitov , Daniel Borkmann , Kernel Team To: Martin Lau Return-path: Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:46526 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751533AbeEHVKg (ORCPT ); Tue, 8 May 2018 17:10:36 -0400 In-Reply-To: <20180504214955.1058805-4-kafai@fb.com> Content-Language: en-US Content-ID: <4613821588E8EC4D823099378E2CB026@namprd15.prod.outlook.com> Sender: netdev-owner@vger.kernel.org List-ID: > On May 4, 2018, at 2:49 PM, Martin KaFai Lau wrote: >=20 > During BPF_OBJ_GET_INFO_BY_FD on a btf_fd, the current bpf_attr's > info.info is directly filled with the BTF binary data. It is > not extensible. In this case, we want to add BTF ID. >=20 > This patch adds "struct bpf_btf_info" which has the BTF ID as > one of its member. The BTF binary data itself is exposed through > the "btf" and "btf_size" members. >=20 > Signed-off-by: Martin KaFai Lau > Acked-by: Alexei Starovoitov > --- > include/uapi/linux/bpf.h | 6 ++++++ > kernel/bpf/btf.c | 26 +++++++++++++++++++++----- > kernel/bpf/syscall.c | 17 ++++++++++++++++- > 3 files changed, 43 insertions(+), 6 deletions(-) >=20 > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index 6106f23a9a8a..d615c777b573 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -2137,6 +2137,12 @@ struct bpf_map_info { > __u32 btf_value_id; > } __attribute__((aligned(8))); >=20 > +struct bpf_btf_info { > + __aligned_u64 btf; > + __u32 btf_size; > + __u32 id; > +} __attribute__((aligned(8))); > + > /* User bpf_sock_addr struct to access socket fields and sockaddr struct = passed > * by user and intended to be used by socket (e.g. to bind to, depends on > * attach attach type). > diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c > index 40950b6bf395..ded10ab47b8a 100644 > --- a/kernel/bpf/btf.c > +++ b/kernel/bpf/btf.c > @@ -2114,12 +2114,28 @@ int btf_get_info_by_fd(const struct btf *btf, > const union bpf_attr *attr, > union bpf_attr __user *uattr) > { > - void __user *udata =3D u64_to_user_ptr(attr->info.info); > - u32 copy_len =3D min_t(u32, btf->data_size, > - attr->info.info_len); > + struct bpf_btf_info __user *uinfo; > + struct bpf_btf_info info =3D {}; > + u32 info_copy, btf_copy; > + void __user *ubtf; > + u32 uinfo_len; >=20 > - if (copy_to_user(udata, btf->data, copy_len) || > - put_user(btf->data_size, &uattr->info.info_len)) > + uinfo =3D u64_to_user_ptr(attr->info.info); > + uinfo_len =3D attr->info.info_len; > + > + info_copy =3D min_t(u32, uinfo_len, sizeof(info)); > + if (copy_from_user(&info, uinfo, info_copy)) > + return -EFAULT; > + > + info.id =3D btf->id; > + ubtf =3D u64_to_user_ptr(info.btf); > + btf_copy =3D min_t(u32, btf->data_size, info.btf_size); > + if (copy_to_user(ubtf, btf->data, btf_copy)) > + return -EFAULT; > + info.btf_size =3D btf->data_size; > + > + if (copy_to_user(uinfo, &info, info_copy) || > + put_user(info_copy, &uattr->info.info_len)) > return -EFAULT; >=20 > return 0; > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index 8b0a45d65454..d2895e3e5cbf 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -2019,6 +2019,21 @@ static int bpf_map_get_info_by_fd(struct bpf_map *= map, > return 0; > } >=20 > +static int bpf_btf_get_info_by_fd(struct btf *btf, > + const union bpf_attr *attr, > + union bpf_attr __user *uattr) > +{ > + struct bpf_btf_info __user *uinfo =3D u64_to_user_ptr(attr->info.info); > + u32 info_len =3D attr->info.info_len; > + int err; > + > + err =3D check_uarg_tail_zero(uinfo, sizeof(*uinfo), info_len); > + if (err) > + return err; > + > + return btf_get_info_by_fd(btf, attr, uattr); > +} > + > #define BPF_OBJ_GET_INFO_BY_FD_LAST_FIELD info.info >=20 > static int bpf_obj_get_info_by_fd(const union bpf_attr *attr, > @@ -2042,7 +2057,7 @@ static int bpf_obj_get_info_by_fd(const union bpf_a= ttr *attr, > err =3D bpf_map_get_info_by_fd(f.file->private_data, attr, > uattr); > else if (f.file->f_op =3D=3D &btf_fops) > - err =3D btf_get_info_by_fd(f.file->private_data, attr, uattr); > + err =3D bpf_btf_get_info_by_fd(f.file->private_data, attr, uattr); > else > err =3D -EINVAL; >=20 > --=20 > 2.9.5 >=20 Acked-by: Song Liu