From patchwork Tue Feb 28 09:31:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 62366 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2915590wrd; Tue, 28 Feb 2023 01:43:30 -0800 (PST) X-Google-Smtp-Source: AK7set9QPNtFyYnEZ1Se+2j2PNwak4VXk605xWLC2rIT5JlM9+ffhVgBrZa6E/cpLTpCB5JBWv5r X-Received: by 2002:a05:6a21:99a2:b0:cb:9bd0:7ee2 with SMTP id ve34-20020a056a2199a200b000cb9bd07ee2mr3316551pzb.45.1677577409711; Tue, 28 Feb 2023 01:43:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677577409; cv=none; d=google.com; s=arc-20160816; b=GuB0NkUWdiWUa5Mmdf95bnb1fjo8wjaeko27EHg9ZK0LbmyRFBmv5rjkrV1Mu9LUCY MtEGMR6o/mObZKQxvt0Y+GWDkJSFe+cwp6qN//bG3wq/mcrsE/k18tAZH/09+4WC8Cpj UHRHWEAZHmcUNwEMWFogcMWmI3josQ27PAC5pJ9k7Tq+N4zIKXUQgKcyFCvDjLrHhs0N hxW+HGw5Sq/odsq/vn1xPb/CNR1FEyLzTetB9PkYYIdcV13cQyl7Dxs0HK7LK0yrQBjl XUQKm7Y2zJ/iGzejso44spW3P3oyLt24rfmwlCkVZX4qcXxJxWJaGoojL1N3lDqOTCc5 QsDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=6AycnDt8+0rcYrLO7sdk8oACYDMbk9ComyCDcdN7198=; b=NBwcPCMWDcietO2oHP0HADOTjwKvhX2p7hPVkW1cTz5/TSpEetcW6oRZM6VyzeErDi ltg1msGKmEq7gEDgc6m6zbrK0iqvgu3/9OoACXHTmIxo2CzDDChKw9ZZyiXjIabsWIvG 4Pgbx9/3ub01vZTzZNnxeOJq7gdg9ozq2g85PawOl9sYgK25n7bAlWCNxQHPJDnDBLo4 05obYmP+b1dTJDyku5Q3NjnOCy4GP4W8W0Wm5hqiUJ+kvO8wPGsQgToZFFfaxtoRkqD3 wWCqP/+UC20Bu5AmCFF6xmdHkVA34FMbo7qNkdtpTv2V4hkXIRp/bOzx8yFUdiQLroeR gYqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=CCMhUpnp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h22-20020a63df56000000b004fb6f75e659si9246826pgj.481.2023.02.28.01.43.16; Tue, 28 Feb 2023 01:43:29 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=CCMhUpnp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231318AbjB1Jcb (ORCPT + 99 others); Tue, 28 Feb 2023 04:32:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47992 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229756AbjB1Jca (ORCPT ); Tue, 28 Feb 2023 04:32:30 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AB3AC206AC; Tue, 28 Feb 2023 01:32:27 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2DF7461032; Tue, 28 Feb 2023 09:32:27 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8407EC433D2; Tue, 28 Feb 2023 09:32:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677576746; bh=ExAvqANCMBI4PJSTQpy4LAwvnp3ITxAWpaClUl88RVE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CCMhUpnpGksEEGVwFsSBWIiWR6/jhTz7gdAOMW0XGAqCW3Bj+m2xAKRd9R9cLhyyD 5nj4PTeCALb7EP0oVbdT2lZO8R5OoWY2pU4XyhJKQrR750OurrWAt6wFFfIPh/GJqs E2L10wJ4+1R9tZStJIeiEGieR1XBKD672vDnq1DfOwnFKn07MZnHG7gCRyiMOphPko 4HXjhf791ZOX7ETRh/arEojsyBYj9l+o8/hkKURTDV79DYqNbPuUVYTJyNcoVfgARB LI98PEm/Bzwd/vEcVwUnqcSMsuj12i6ceHqusdn0iyCKLSmyjumomrLC86d8o3nAm0 4h3ddy6Zn981A== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Matthew Wilcox Cc: bpf@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Daniel Borkmann , Namhyung Kim Subject: [PATCH RFC v2 bpf-next 1/9] mm: Store build id in inode object Date: Tue, 28 Feb 2023 10:31:58 +0100 Message-Id: <20230228093206.821563-2-jolsa@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230228093206.821563-1-jolsa@kernel.org> References: <20230228093206.821563-1-jolsa@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759067410178676138?= X-GMAIL-MSGID: =?utf-8?q?1759067410178676138?= Storing build id in file's inode object for elf executable with build id defined. The build id is stored when file is mmaped. This is enabled with new config option CONFIG_INODE_BUILD_ID. The build id is valid only when the file with given inode is mmap-ed. We store either the build id itself or the error we hit during the retrieval. Signed-off-by: Jiri Olsa --- fs/inode.c | 12 ++++++++++++ include/linux/buildid.h | 15 +++++++++++++++ include/linux/fs.h | 7 +++++++ lib/buildid.c | 40 ++++++++++++++++++++++++++++++++++++++++ mm/Kconfig | 8 ++++++++ mm/mmap.c | 23 +++++++++++++++++++++++ 6 files changed, 105 insertions(+) diff --git a/fs/inode.c b/fs/inode.c index 4558dc2f1355..e56593e3c301 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "internal.h" /* @@ -228,6 +229,10 @@ int inode_init_always(struct super_block *sb, struct inode *inode) #endif inode->i_flctx = NULL; +#ifdef CONFIG_INODE_BUILD_ID + inode->i_build_id = NULL; + spin_lock_init(&inode->i_build_id_lock); +#endif if (unlikely(security_inode_alloc(inode))) return -ENOMEM; this_cpu_inc(nr_inodes); @@ -296,6 +301,11 @@ void __destroy_inode(struct inode *inode) if (inode->i_default_acl && !is_uncached_acl(inode->i_default_acl)) posix_acl_release(inode->i_default_acl); #endif +#ifdef CONFIG_INODE_BUILD_ID + build_id_free(inode->i_build_id); + inode->i_build_id = NULL; +#endif + this_cpu_dec(nr_inodes); } EXPORT_SYMBOL(__destroy_inode); @@ -2242,6 +2252,8 @@ void __init inode_init(void) SLAB_MEM_SPREAD|SLAB_ACCOUNT), init_once); + build_id_init(); + /* Hash may have been set up in inode_init_early */ if (!hashdist) return; diff --git a/include/linux/buildid.h b/include/linux/buildid.h index 3b7a0ff4642f..485640da9393 100644 --- a/include/linux/buildid.h +++ b/include/linux/buildid.h @@ -3,9 +3,15 @@ #define _LINUX_BUILDID_H #include +#include #define BUILD_ID_SIZE_MAX 20 +struct build_id { + u32 sz; + char data[BUILD_ID_SIZE_MAX]; +}; + int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id, __u32 *size); int build_id_parse_buf(const void *buf, unsigned char *build_id, u32 buf_size); @@ -17,4 +23,13 @@ void init_vmlinux_build_id(void); static inline void init_vmlinux_build_id(void) { } #endif +#ifdef CONFIG_INODE_BUILD_ID +void __init build_id_init(void); +void build_id_free(struct build_id *bid); +void vma_read_build_id(struct vm_area_struct *vma, struct build_id **bidp); +#else +static inline void __init build_id_init(void) { } +static inline void build_id_free(struct build_id *bid) { } +#endif /* CONFIG_INODE_BUILD_ID */ + #endif diff --git a/include/linux/fs.h b/include/linux/fs.h index 2acc46fb5f97..72e63dcf86a1 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -699,6 +700,12 @@ struct inode { struct fsverity_info *i_verity_info; #endif +#ifdef CONFIG_INODE_BUILD_ID + /* Initialized and valid for executable elf files when mmap-ed. */ + struct build_id *i_build_id; + spinlock_t i_build_id_lock; +#endif + void *i_private; /* fs or device private pointer */ } __randomize_layout; diff --git a/lib/buildid.c b/lib/buildid.c index dfc62625cae4..2c824e3dcc29 100644 --- a/lib/buildid.c +++ b/lib/buildid.c @@ -5,6 +5,7 @@ #include #include #include +#include #define BUILD_ID 3 @@ -189,3 +190,42 @@ void __init init_vmlinux_build_id(void) build_id_parse_buf(&__start_notes, vmlinux_build_id, size); } #endif + +#ifdef CONFIG_INODE_BUILD_ID + +/* SLAB cache for build_id structures */ +static struct kmem_cache *build_id_cachep; + +void vma_read_build_id(struct vm_area_struct *vma, struct build_id **bidp) +{ + struct build_id *bid = ERR_PTR(-ENOMEM); + int err; + + if (!build_id_cachep) + goto out; + bid = kmem_cache_alloc(build_id_cachep, GFP_KERNEL); + if (!bid) + goto out; + err = build_id_parse(vma, bid->data, &bid->sz); + if (err) { + build_id_free(bid); + bid = ERR_PTR(err); + } +out: + *bidp = bid; +} + +void build_id_free(struct build_id *bid) +{ + if (IS_ERR_OR_NULL(bid)) + return; + kmem_cache_free(build_id_cachep, bid); +} + +void __init build_id_init(void) +{ + build_id_cachep = kmem_cache_create("build_id", sizeof(struct build_id), 0, + SLAB_HWCACHE_ALIGN | SLAB_PANIC | SLAB_ACCOUNT, NULL); +} + +#endif /* CONFIG_INODE_BUILD_ID */ diff --git a/mm/Kconfig b/mm/Kconfig index ff7b209dec05..02f40d58ff74 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -1183,6 +1183,14 @@ config LRU_GEN_STATS This option has a per-memcg and per-node memory overhead. # } +config INODE_BUILD_ID + bool "Store build id in inode object" + default n + help + Store build id in iinode object for elf executable with build id + defined. The build id is stored when file for the given inode is + mmap-ed. + source "mm/damon/Kconfig" endmenu diff --git a/mm/mmap.c b/mm/mmap.c index 425a9349e610..e6c8ec05804f 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -2530,6 +2530,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr, pgoff_t vm_pgoff; int error; MA_STATE(mas, &mm->mm_mt, addr, end - 1); + struct build_id *bid = NULL; /* Check against address space limit. */ if (!may_expand_vm(mm, vm_flags, len >> PAGE_SHIFT)) { @@ -2626,6 +2627,10 @@ unsigned long mmap_region(struct file *file, unsigned long addr, if (error) goto unmap_and_free_vma; +#ifdef CONFIG_INODE_BUILD_ID + if (vma->vm_flags & VM_EXEC) + vma_read_build_id(vma, &bid); +#endif /* * Expansion is handled above, merging is handled below. * Drivers should not alter the address of the VMA. @@ -2690,6 +2695,23 @@ unsigned long mmap_region(struct file *file, unsigned long addr, goto free_vma; } +#ifdef CONFIG_INODE_BUILD_ID + if (bid) { + struct inode *inode = file_inode(file); + + spin_lock(&inode->i_build_id_lock); + /* + * If there's already valid build_id in inode, release it + * and use the new one. + */ + if (inode->i_build_id) + build_id_free(inode->i_build_id); + + inode->i_build_id = bid; + spin_unlock(&inode->i_build_id_lock); + } +#endif + if (vma->vm_file) i_mmap_lock_write(vma->vm_file->f_mapping); @@ -2759,6 +2781,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr, mapping_unmap_writable(file->f_mapping); free_vma: vm_area_free(vma); + build_id_free(bid); unacct_error: if (charged) vm_unacct_memory(charged); From patchwork Tue Feb 28 09:31:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 62368 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2915674wrd; Tue, 28 Feb 2023 01:43:43 -0800 (PST) X-Google-Smtp-Source: AK7set/pkYH/nZBjUWVpmhFoRkO9HubsQSaMhMG1zs7x6e3EOxVuzCbwUN5gwYuF1OEtx5+JoIFH X-Received: by 2002:a17:906:db02:b0:8e1:1f8c:5670 with SMTP id xj2-20020a170906db0200b008e11f8c5670mr2527347ejb.5.1677577423692; Tue, 28 Feb 2023 01:43:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677577423; cv=none; d=google.com; s=arc-20160816; b=tYMWN3zN9Qy0NtVMUTyuE+uVbSZzVp/14TgcwEfi2h6kHON7cgpfH6/3F/0r/e2CNU h90SjzoRnxr+N5RLx1v4RyIhLGx38/cNOTOqqVI/cJawQjPGoyOk7lyHwCgkak89yaQq hAVI/+GSI9Sweho4fgtGTq2hXztr980961wc4eO7zeO+bh2t57GNEqBa8ItUqoT70Z4j aZ7mCho51m8dJjVfgBbLdK4ioHx2v/q2ALiwbJZT90jZuD+NPdrvNGTapCkgGVtxEFH/ AElQnWoXlBSYjDH/uRau3V+nShZzMZXzGAuXchh3zCnCX/HuqdDNYvWRlfBsO+KfMLzo 5wGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=jRiMVL8UMxdDmYRWnPBpaiDnrL4C3JcclWXafbd0+ks=; b=o1A/cQ7ArwnIhe9xSBQ1Uru3JKeLejeVCaCKTJM7DRbs+C2+e83L7bGwr/yCan3hxj iaSBvGlRmF/k33vFCcEspPCXcaiimmzpwWjy+qojqxKlmxvdV+3nM9qvM7pfP7Vq6Eva kK/bImLfIsh0P7QQI9yWWuUe2QH9Hdup/0YEiRNLFygMNdAC8yApsynF+ywmBMbJ+G7a 69RmORoHK5hgZM83FxspUQPmXvBGdnLoKQrO7I09F1hu2cLuMTZAFbKSUv8TwqCqxybI qhpyLplf9VjA7VhLKO3KoGsHpfraC7tphWWRoAvu+41hsPPm74gK0lmWLPcOC5n7fpcB u+0g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=HBaS3gT2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id lf17-20020a170906ae5100b008b315ed8bd6si11225538ejb.787.2023.02.28.01.43.21; Tue, 28 Feb 2023 01:43:43 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=HBaS3gT2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230334AbjB1Jcr (ORCPT + 99 others); Tue, 28 Feb 2023 04:32:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48210 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231331AbjB1Jcl (ORCPT ); Tue, 28 Feb 2023 04:32:41 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 625D5211F6; Tue, 28 Feb 2023 01:32:40 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id F386860FFC; Tue, 28 Feb 2023 09:32:39 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 532EFC4339C; Tue, 28 Feb 2023 09:32:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677576759; bh=KVeSwjr1MM70r3HIU41SsfKM/mZY7sGzW/FlWf73V/s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HBaS3gT21KO0nsyCT8FwE/BIVPSrUUAxD9WbcMeJSMhx+MPsx2OXhehXjktvVQ9SF kgJTVUP2drmveFEQk744dTA34D7L/FR0tCswjY48qD3gZLezBwpxEZdaAKZUfEV9E8 puKhKdldF5sCccw/H2cmBkC1DcvkyZ0EPz3U9fIMjXlUn7pqlNJ4oKgcBkNiYoOlta cVp0OrKcyhSKGCigtDHHEBTfcJIn3NdplKyAHXX+250Ogh4BZ5UuwAz7T0/68WfyFW ib8w3H4K5cOCX3dNnQvhTkO039M+djRYVP/majEBXvugWcRXiA6lq1snRVqbeG+RoZ mhHeZuGdkPo5w== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Matthew Wilcox Cc: bpf@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Daniel Borkmann , Namhyung Kim Subject: [PATCH RFC v2 bpf-next 2/9] bpf: Use file's inode object build id in stackmap Date: Tue, 28 Feb 2023 10:31:59 +0100 Message-Id: <20230228093206.821563-3-jolsa@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230228093206.821563-1-jolsa@kernel.org> References: <20230228093206.821563-1-jolsa@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759067424548678881?= X-GMAIL-MSGID: =?utf-8?q?1759067424548678881?= Use build id from file's inode object in stackmap if it's available. Signed-off-by: Jiri Olsa --- kernel/bpf/stackmap.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index aecea7451b61..9b9578e0cada 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -124,6 +124,28 @@ static struct bpf_map *stack_map_alloc(union bpf_attr *attr) return ERR_PTR(err); } +#ifdef CONFIG_INODE_BUILD_ID +static int vma_get_build_id(struct vm_area_struct *vma, unsigned char *build_id) +{ + struct build_id *bid; + + if (!vma->vm_file) + return -EINVAL; + bid = file_inode(vma->vm_file)->i_build_id; + if (IS_ERR_OR_NULL(bid)) + return bid ? PTR_ERR(bid) : -ENOENT; + if (bid->sz > BUILD_ID_SIZE_MAX) + return -EINVAL; + memcpy(build_id, bid->data, bid->sz); + return 0; +} +#else +static int vma_get_build_id(struct vm_area_struct *vma, unsigned char *build_id) +{ + return build_id_parse(vma, build_id, NULL); +} +#endif + static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs, u64 *ips, u32 trace_nr, bool user) { @@ -156,7 +178,7 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs, goto build_id_valid; } vma = find_vma(current->mm, ips[i]); - if (!vma || build_id_parse(vma, id_offs[i].build_id, NULL)) { + if (!vma || vma_get_build_id(vma, id_offs[i].build_id)) { /* per entry fall back to ips */ id_offs[i].status = BPF_STACK_BUILD_ID_IP; id_offs[i].ip = ips[i]; From patchwork Tue Feb 28 09:32:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 62367 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2915641wrd; Tue, 28 Feb 2023 01:43:37 -0800 (PST) X-Google-Smtp-Source: AK7set/cMPPPI4OhesfCd2WlVZ4wKM1VAP6hb4VhFMT89Gos1JnvfxzQcml2gWtQlisZZnEOIxDn X-Received: by 2002:a05:6a20:144d:b0:cd:c79:50e8 with SMTP id a13-20020a056a20144d00b000cd0c7950e8mr3270633pzi.62.1677577417191; Tue, 28 Feb 2023 01:43:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677577417; cv=none; d=google.com; s=arc-20160816; b=dNU0aVshtP/KAyQwrmE8Nfd2QSV55g0GNVtaF8y32OkxQnlmNdlP8b6UDIoYsldEBg LQJ5cEfIPqq2vREtUUSa/AGDaJaLB66eWHI3RicFqY7IGskYwCJdFCWmjvgY/rgmYW00 zuENaHNRoSQki4EfkqBQtINaf4G3RJ93pSw0lyow/0NlVwmD/X119OdXoxT0VqJQeBGU ok0HrZ8mYXq3oMiOStn05M6cEdaEEjhpRsv1Ibq21SCoI5yMpLDCeQvdA61pCMh6zH/e j6fsy5LVunwdVRN1wtfBg54XctHvX3CPLEyuaWtxlG7QUjc6EGI/8aOSMt1jTcTrkxmz uSiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=CeCJ0oEk5RL2g2O2Wkuzd5KPC6xHac/W/ZeSwdsbPjc=; b=CucEZMp4J3qO/0ymVKAEpuIufxs8G5XiEjdM+lnBQ2mkIF/izS28T2JuXwPCtDwUv3 vJllI1FearQXAYyERIb1e/TRzeMvgkbzrLEBDTNf7UzLIpjOFK1hwV/gbHHdWYNc/1XA 0e7VaQd83kxD+MKcq4lM64dyzU6AV/TRTqodE1fCC739B9uCKEa0XFLPmTOkX9ZvErw5 76rcjz2BfHmxwYlgpK9bg+gun8e3ctK897kT0BbFpkXxrkdFnn78eK6yYzn+QuXimKFr 5xYqiXVGuW6nNb/IeTeFpMGPgF6rkF9ygsuh17TOoZwXe98cDeqH6c1MwhPot8U5RxHy CYFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=UUER4sVx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y1-20020a633201000000b0050382913ab1si38548pgy.579.2023.02.28.01.43.24; Tue, 28 Feb 2023 01:43:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=UUER4sVx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230097AbjB1JdD (ORCPT + 99 others); Tue, 28 Feb 2023 04:33:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231331AbjB1Jc7 (ORCPT ); Tue, 28 Feb 2023 04:32:59 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5BF7219BF; Tue, 28 Feb 2023 01:32:53 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id DDD266103A; Tue, 28 Feb 2023 09:32:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3B153C4339B; Tue, 28 Feb 2023 09:32:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677576772; bh=gRbBq9vcg2Rx0X4DobOUrTbz29HAnK95YnrQdwF+tOs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UUER4sVx5kKwhIxZJzXS365tQT33utMe1eesSOX10vXEV3c2fXxOy4y9NsJhXUSVj KGCct3+pPhcRE6etwiID1UiyTVQBD13Q7e8AhkqWdblrc0rmr+ztVaXWSb6Pv+KEry YuRjGz9aua3cIofqdhIrhgf/Z1iqxjOuygz3pleLvUxOJ5hfKziy/n/soR1wUwG7aS nzcl/wOtvF13q+0mNO4y6Zse0dxmwf8NZw0Kp6Hw5MonV1qnkiGJWFjTEb++bv3uDS SximpWRECz8+nkMrKJImloHn5eZrbunWLqwZ0EXwwrH7Zw7a6dbLxXJtMKTLweRI9B Uvg44OWRgv/pg== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Matthew Wilcox Cc: bpf@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Daniel Borkmann , Namhyung Kim Subject: [PATCH RFC v2 bpf-next 3/9] perf: Use file object build id in perf_event_mmap_event Date: Tue, 28 Feb 2023 10:32:00 +0100 Message-Id: <20230228093206.821563-4-jolsa@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230228093206.821563-1-jolsa@kernel.org> References: <20230228093206.821563-1-jolsa@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759067417557870841?= X-GMAIL-MSGID: =?utf-8?q?1759067417557870841?= Use build id from file's inode object when available for perf's MMAP2 event build id data. Signed-off-by: Jiri Olsa --- kernel/events/core.c | 46 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 7099c77bc53b..148f78a88492 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -8527,6 +8527,9 @@ struct perf_mmap_event { u32 prot, flags; u8 build_id[BUILD_ID_SIZE_MAX]; u32 build_id_size; +#ifdef CONFIG_INODE_BUILD_ID + struct build_id *i_build_id; +#endif struct { struct perf_event_header header; @@ -8539,6 +8542,41 @@ struct perf_mmap_event { } event_id; }; +#ifdef CONFIG_INODE_BUILD_ID +static void build_id_read(struct perf_mmap_event *mmap_event) +{ + struct vm_area_struct *vma = mmap_event->vma; + struct inode *inode = NULL; + + if (vma->vm_file) + inode = file_inode(vma->vm_file); + mmap_event->i_build_id = inode ? inode->i_build_id : NULL; +} + +static bool has_build_id(struct perf_mmap_event *mmap_event) +{ + return !IS_ERR_OR_NULL(mmap_event->i_build_id); +} + +#define build_id_data mmap_event->i_build_id->data +#define build_id_size mmap_event->i_build_id->sz +#else +static void build_id_read(struct perf_mmap_event *mmap_event) +{ + struct vm_area_struct *vma = mmap_event->vma; + + build_id_parse(vma, mmap_event->build_id, &mmap_event->build_id_size); +} + +static bool has_build_id(struct perf_mmap_event *mmap_event) +{ + return mmap_event->build_id_size; +} + +#define build_id_data mmap_event->build_id +#define build_id_size mmap_event->build_id_size +#endif + static int perf_event_mmap_match(struct perf_event *event, void *data) { @@ -8583,7 +8621,7 @@ static void perf_event_mmap_output(struct perf_event *event, mmap_event->event_id.pid = perf_event_pid(event, current); mmap_event->event_id.tid = perf_event_tid(event, current); - use_build_id = event->attr.build_id && mmap_event->build_id_size; + use_build_id = event->attr.build_id && has_build_id(mmap_event); if (event->attr.mmap2 && use_build_id) mmap_event->event_id.header.misc |= PERF_RECORD_MISC_MMAP_BUILD_ID; @@ -8592,10 +8630,10 @@ static void perf_event_mmap_output(struct perf_event *event, if (event->attr.mmap2) { if (use_build_id) { - u8 size[4] = { (u8) mmap_event->build_id_size, 0, 0, 0 }; + u8 size[4] = { (u8) build_id_size, 0, 0, 0 }; __output_copy(&handle, size, 4); - __output_copy(&handle, mmap_event->build_id, BUILD_ID_SIZE_MAX); + __output_copy(&handle, build_id_data, BUILD_ID_SIZE_MAX); } else { perf_output_put(&handle, mmap_event->maj); perf_output_put(&handle, mmap_event->min); @@ -8727,7 +8765,7 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) mmap_event->event_id.header.size = sizeof(mmap_event->event_id) + size; if (atomic_read(&nr_build_id_events)) - build_id_parse(vma, mmap_event->build_id, &mmap_event->build_id_size); + build_id_read(mmap_event); perf_iterate_sb(perf_event_mmap_output, mmap_event, From patchwork Tue Feb 28 09:32:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 62373 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2916116wrd; Tue, 28 Feb 2023 01:44:43 -0800 (PST) X-Google-Smtp-Source: AK7set8kP+7vo8ZZodX4GNKO6n1WsW4UjOJ/+aQPkSYeA8y2pry8Mog6sIxXuWKZOe2vsQfWqys6 X-Received: by 2002:a05:6a20:7d86:b0:cd:832c:f9c6 with SMTP id v6-20020a056a207d8600b000cd832cf9c6mr3551346pzj.1.1677577483018; Tue, 28 Feb 2023 01:44:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677577483; cv=none; d=google.com; s=arc-20160816; b=jafdCZG+ylO+egRZhr5sfiySz8G+yStOaWalBjnm3optsJJPztx/OjgdjGZGRX0+eb dQneXpRNkbXlKntJ97ylcQkEGmQSxjvE0hLWsSMIFoawKzzI4TeyiT2xdWCqLXN+RUdX 3P3mPfKA4Nd7E8oWdgENoxboO69bJn8HWodVYlbVEW3eKBPiK4ObWyvf8c4f+KCR7xPu QPU5vYDjRuTeEgAWNNYsnwXcbN348NwTflsPyAghz4UHfnOm99z/HIznOKGXPd6coGbl 9Sn6UVfuxN2v8aLsDa5ATOu4QNRnHh/dvejkaU4nikOSvLjYvZ4PoCKJybWMm0gcG712 kUDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=21ZcV3iop64YVxmHDxSZ9xcbaXWaQmOe/vXsohNTMmc=; b=yYvipEmkR9soAe8tgyq+ZxKaBlczdIG9rkWcrGqdCEIYVAl0rCOhVxPtzqAnIBxldZ xP3wRYK88itoRut+9zvo/1NlJek2ftiwZSWVtOF1qCamgwBWcmWJzVqfsfSdsWfuz3Dz 95ytmOTbwVIxG8zeLSTvpn5/jrRSwpbHvyCTdQOX7X5/30jknX7LrK5AHXpi49xfRin9 ZvRHViv1FOkBlYrlz13HQ1ur7HTNCMvo8fOxIdFstbSu1fsVT2msvOSAj+ddKLNxzXBs HBQyUMF/YwEVZJRuAVoCTwWj3XN1Aay+so1BPPaClPIKLTanry247TPPLLN6oOOKNoLL MsiQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=m6kPxmfU; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 64-20020a630043000000b004f2200cade5si9508105pga.359.2023.02.28.01.44.30; Tue, 28 Feb 2023 01:44:42 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=m6kPxmfU; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229549AbjB1JdT (ORCPT + 99 others); Tue, 28 Feb 2023 04:33:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231355AbjB1JdP (ORCPT ); Tue, 28 Feb 2023 04:33:15 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EA6AA1FF6; Tue, 28 Feb 2023 01:33:07 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 725F2B80E12; Tue, 28 Feb 2023 09:33:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB3D7C433EF; Tue, 28 Feb 2023 09:32:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677576785; bh=QJB3wPU2HWgjAFGuMz7NkbXXZcNkRHN6drkDJ+SyIYY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=m6kPxmfUjqBPyP1zjk/AUvq0/knP93c2G+bJV20AAk00Bn5Qy1ceLoPdeWzhhd66V C9PoDgaO8rIzmIHx+zhN6nkA+kRPYAwGKfC1VDZEgYNjMAhQbGB0eypPdGJFHD2N2y vaePjn5SoDDn0dEkIf75C8Pfa7RvzbalnvALHj9mvgHJy8WdgTPhm9JEmabCzuuo/k fDGJm19tk2+IfAuCsGapu6TbdLHo4eP/EqBsqwW6qqkL/Lc0+Fv/y1RTxYHDh8tlHE GkDspDLRDbIm19taZ2SguntVqk7d/0F/NViAB3I+CONr1oBs9FaKr8W63nBjkqhJNr LtdzQ20YTBC/w== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Matthew Wilcox Cc: bpf@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Daniel Borkmann , Namhyung Kim Subject: [PATCH RFC v2 bpf-next 4/9] libbpf: Allow to resolve binary path in current directory Date: Tue, 28 Feb 2023 10:32:01 +0100 Message-Id: <20230228093206.821563-5-jolsa@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230228093206.821563-1-jolsa@kernel.org> References: <20230228093206.821563-1-jolsa@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759067486846765363?= X-GMAIL-MSGID: =?utf-8?q?1759067486846765363?= Try to resolve uprobe/usdt binary path also in current directory, it's used in the test code in following changes. Signed-off-by: Jiri Olsa --- tools/lib/bpf/libbpf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 05c4db355f28..f72115e8b7f9 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -10727,17 +10727,19 @@ static const char *arch_specific_lib_paths(void) /* Get full path to program/shared library. */ static int resolve_full_path(const char *file, char *result, size_t result_sz) { - const char *search_paths[3] = {}; + const char *search_paths[4] = {}; int i, perm; if (str_has_sfx(file, ".so") || strstr(file, ".so.")) { search_paths[0] = getenv("LD_LIBRARY_PATH"); search_paths[1] = "/usr/lib64:/usr/lib"; search_paths[2] = arch_specific_lib_paths(); + search_paths[3] = "."; perm = R_OK; } else { search_paths[0] = getenv("PATH"); search_paths[1] = "/usr/bin:/usr/sbin"; + search_paths[2] = "."; perm = R_OK | X_OK; } From patchwork Tue Feb 28 09:32:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 62369 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2915723wrd; Tue, 28 Feb 2023 01:43:51 -0800 (PST) X-Google-Smtp-Source: AK7set/OIWF3sAJUoD3bftPofu7EAG39jfBLtYPQvMOy4I4DjR9Vvx8/ubi341yDF/C0bSV/wj2g X-Received: by 2002:a17:902:ec91:b0:19d:397b:f05 with SMTP id x17-20020a170902ec9100b0019d397b0f05mr2233608plg.32.1677577431014; Tue, 28 Feb 2023 01:43:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677577430; cv=none; d=google.com; s=arc-20160816; b=YDEDQz5uMv3GecylLzdQYqW0IhFakxDhD1/wYWSbwqQsl9fIypdjYRII8GgukMI+X6 AFycAEvxAwf/qxtfOmzt8gTl9KD73tL1EQz7rjoNZ8D9G/rO2ub6JSA4cMgpbWfF46cm ocwLQViOJNaL9TlNJXfyWW6PgIfzY0eAunXvWqFeddzc2gyxnbHgf7rpYNxMuLJcgCt7 5kfhTZ7r5maPnGUY46Rr+mrV+YiSQIaDeptVNrdPeivSfjpK0pVCqk2d/hsP5B7fADX3 DcX7lgKLmArpkQ58zHGGiA782jwKjdqF+d/DT7P3+JZUv0yYJiTjUV0WUOPg1y76j7K4 WojQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=RCfAOoOtUYQjyPklEAGADj6Gp4MryDiUuzxiCRFMKOY=; b=tu+G5bKH6g8q1WsjXiED9wTIG0/ywJDFiOa54stVVE4Q/b37nLBqE+dUsv//v6VPNj vOjNfESJDQaVScFucrO8bp5310XcnYPtSp2JjmwmcllsZZca+NoTK2CJBBg+SPMfhtfo /dlpHaVmZpcm2KNL1aY3h2ElD0RI44hG0dWwbZdACB2Opwhzn1vDttzYadDOsF9A8njM fPMdzXUO4dZrlYMOl0VggKhWqOk5Lc954mFUALtlfG8/gU2vAzBF2D0TRQ53y2BSI5m+ 4phQbCeDD+UgCmsNohZH0CZWfSZTDWYudy2ctIxU/bbYfC1sN0vnLHiT6jOFnqL/H5ou NtTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ig3GSFl6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id li16-20020a170903295000b00196263e2942si1334716plb.497.2023.02.28.01.43.38; Tue, 28 Feb 2023 01:43:50 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ig3GSFl6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231356AbjB1Jdf (ORCPT + 99 others); Tue, 28 Feb 2023 04:33:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48232 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231370AbjB1Jd3 (ORCPT ); Tue, 28 Feb 2023 04:33:29 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9E39F1E28F; Tue, 28 Feb 2023 01:33:20 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 31E3FB80D3A; Tue, 28 Feb 2023 09:33:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C43FEC433D2; Tue, 28 Feb 2023 09:33:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677576797; bh=c9z68q+WdAEZYqVryh8zZBbeNYueFUIM9/Jpow2jaNA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ig3GSFl6mH1gtKMNYEwibcAW7JNIHR8jX9SMP4+o1z10djXhgAmdA70qQeTXISQwj 6kmZOFt/BRo35UGXyT0MyxaJM2gT20Dc/OAvY/sOrQLOkc1UPuDL+3nYvsJ5vey6SW 78yXIfTc8YS62UD+6vhwCq+Mdh1g8lCRcT44EX9+Sjbv8IAoiTAsjrvxw93aTKTX0i jTtDaeU5cvMgDE4B0W/LxBiMBgmc0rCvJv4xKYYwWK/rCxNSmZ6AIcQgPyhCDqQK7X GQVQJa8izimvaKUlWPYrb5rvrs0dQg1E9pF77uWyFo0d+kPaNk+ahJXpO+hArWBPYa Tvd2HkhnVTk4w== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Matthew Wilcox Cc: bpf@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Daniel Borkmann , Namhyung Kim Subject: [PATCH RFC v2 bpf-next 5/9] selftests/bpf: Add read_buildid function Date: Tue, 28 Feb 2023 10:32:02 +0100 Message-Id: <20230228093206.821563-6-jolsa@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230228093206.821563-1-jolsa@kernel.org> References: <20230228093206.821563-1-jolsa@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759067432229900613?= X-GMAIL-MSGID: =?utf-8?q?1759067432229900613?= Adding read_build_id function that parses out build id from specified binary. It will replace extract_build_id and also be used in following changes. Signed-off-by: Jiri Olsa --- tools/testing/selftests/bpf/trace_helpers.c | 98 +++++++++++++++++++++ tools/testing/selftests/bpf/trace_helpers.h | 5 ++ 2 files changed, 103 insertions(+) diff --git a/tools/testing/selftests/bpf/trace_helpers.c b/tools/testing/selftests/bpf/trace_helpers.c index 09a16a77bae4..c10e16626cd3 100644 --- a/tools/testing/selftests/bpf/trace_helpers.c +++ b/tools/testing/selftests/bpf/trace_helpers.c @@ -11,6 +11,9 @@ #include #include #include "trace_helpers.h" +#include +#include +#include #define DEBUGFS "/sys/kernel/debug/tracing/" @@ -230,3 +233,98 @@ ssize_t get_rel_offset(uintptr_t addr) fclose(f); return -EINVAL; } + +static int +parse_build_id_buf(const void *note_start, Elf32_Word note_size, + char *build_id) +{ + Elf32_Word note_offs = 0, new_offs; + + while (note_offs + sizeof(Elf32_Nhdr) < note_size) { + Elf32_Nhdr *nhdr = (Elf32_Nhdr *)(note_start + note_offs); + + if (nhdr->n_type == 3 && + nhdr->n_namesz == sizeof("GNU") && + !strcmp((char *)(nhdr + 1), "GNU") && + nhdr->n_descsz > 0 && + nhdr->n_descsz <= BPF_BUILD_ID_SIZE) { + memcpy(build_id, note_start + note_offs + + ALIGN(sizeof("GNU"), 4) + sizeof(Elf32_Nhdr), + nhdr->n_descsz); + memset(build_id + nhdr->n_descsz, 0, + BPF_BUILD_ID_SIZE - nhdr->n_descsz); + return (int) nhdr->n_descsz; + } + + new_offs = note_offs + sizeof(Elf32_Nhdr) + + ALIGN(nhdr->n_namesz, 4) + ALIGN(nhdr->n_descsz, 4); + + if (new_offs >= note_size) + break; + note_offs = new_offs; + } + + return -EINVAL; +} + +/* Reads binary from *path* file and returns it in the *build_id* + * which is expected to be at least BPF_BUILD_ID_SIZE bytes. + * Returns size of build id on success. On error the error value + * is returned. + */ +int read_build_id(const char *path, char *build_id) +{ + int fd, err = -EINVAL; + Elf *elf = NULL; + GElf_Ehdr ehdr; + size_t max, i; + + fd = open(path, O_RDONLY | O_CLOEXEC); + if (fd < 0) + return -errno; + + (void)elf_version(EV_CURRENT); + + elf = elf_begin(fd, ELF_C_READ, NULL); + if (!elf) + goto out; + + if (elf_kind(elf) != ELF_K_ELF) + goto out; + + if (gelf_getehdr(elf, &ehdr) == NULL) + goto out; + + if (ehdr.e_ident[EI_CLASS] != ELFCLASS64) + goto out; + + for (i = 0; i < ehdr.e_phnum; i++) { + GElf_Phdr mem, *phdr; + char *data; + + phdr = gelf_getphdr(elf, i, &mem); + if (!phdr) + goto out; + + if (phdr->p_type != PT_NOTE) + continue; + + data = elf_rawfile(elf, &max); + if (!data) + goto out; + + if (phdr->p_offset >= max || + (phdr->p_offset + phdr->p_memsz >= max)) + goto out; + + err = parse_build_id_buf(data + phdr->p_offset, phdr->p_memsz, build_id); + if (err > 0) + goto out; + } + +out: + if (elf) + elf_end(elf); + close(fd); + return err; +} diff --git a/tools/testing/selftests/bpf/trace_helpers.h b/tools/testing/selftests/bpf/trace_helpers.h index 53efde0e2998..50b2cc498ba7 100644 --- a/tools/testing/selftests/bpf/trace_helpers.h +++ b/tools/testing/selftests/bpf/trace_helpers.h @@ -4,6 +4,9 @@ #include +#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) +#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask)) + struct ksym { long addr; char *name; @@ -23,4 +26,6 @@ void read_trace_pipe(void); ssize_t get_uprobe_offset(const void *addr); ssize_t get_rel_offset(uintptr_t addr); +int read_build_id(const char *path, char *build_id); + #endif From patchwork Tue Feb 28 09:32:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 62370 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2915786wrd; Tue, 28 Feb 2023 01:44:02 -0800 (PST) X-Google-Smtp-Source: AK7set8J7pn21/0mik1O8gRpRjCYc2ZFYrCrif82YS9JLRRvg+k1QN8TeSVq0MsVS1agJL1vI0G8 X-Received: by 2002:a17:902:cec5:b0:19a:6acc:1de2 with SMTP id d5-20020a170902cec500b0019a6acc1de2mr2262078plg.35.1677577441751; Tue, 28 Feb 2023 01:44:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677577441; cv=none; d=google.com; s=arc-20160816; b=xc0VKRoma56lA0eAER98azV6h6u7WOhoNmrpXoqmClU1EXTOgFp6VK6ZD66UadaLUU V5RLhzwf/Nddxdw9DhZdS66wWZlOCMBTKR+5e+iK1meS6fc0CltBVGFy9Ecv/CD9ipzX twOEcxMxeyKv1cNxdPQ98No0i579yDZquR1cPWvtUQhq6S0eRi/umfbzq0xujekSZ2wz A6s8IlRm7+NjGw1qwrj1UVIdwrIieluyJm/O4Y9qmnuqVbkwZbNVlvnnGqkU0WjGsllY jM8BxdeB6cvY6V5bQJRKLrVqjXmV2+lP5aIgWCYeb3NM6B1b0eqIR8jO2H1smuiTHW2S hj2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=YzOjVEVDvmt36cWz38x+2kR8qDP4JvBCurVU7duy1n4=; b=DtmKdKD6bFzNs5JrzW80Esm5U+ebw8KocHjS67b6vTlcCXSVwxG0w6PkUPQbF5cZTO Lhl3cT8tQk07S/Qt3aWCKAocSsLfyBI436b+kw/kikfMq8ns0MpMuOmE2hPQFmMHSRe2 +we7+5nQIyKEE51Qj7SYn3g1wtiABL3+fZNLF67eofo2gTQixP8hDWS9l+ib98ywaR7l C4O0yx0P1ZP8XD5eUYmvNHqTj5Lu1EvjPVGtVv/8Kc9PJ72c3MMTVyfqUrM+LMHPx0zQ q1B6NvPYyP5NusqsgU6DjfHqSLombsawCMSm6eFyVnlAYDxzhBasdhZvsHxB4Nel/36E z23Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Zgd0zI0q; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id v10-20020a1709028d8a00b001994a358baasi8635545plo.146.2023.02.28.01.43.49; Tue, 28 Feb 2023 01:44:01 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Zgd0zI0q; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231367AbjB1Jdv (ORCPT + 99 others); Tue, 28 Feb 2023 04:33:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50204 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231351AbjB1Jdq (ORCPT ); Tue, 28 Feb 2023 04:33:46 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BB2B2199B; Tue, 28 Feb 2023 01:33:33 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 07BC7B80DFF; Tue, 28 Feb 2023 09:33:32 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9C855C433EF; Tue, 28 Feb 2023 09:33:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677576810; bh=ySf52tgWqEzdgE2vONbMq7274Pu4w3NaXS6sukUJ/0A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Zgd0zI0qCybzWRqKGIKUz+Rm49XKg3Uy7NFHPGFw2GDLDuL1jlUXC13xDSN/8EHMo 4V5P+uyoEs9Zuhajj71FPcUKW6bLUmymtvxLe8/74wwj3vDCvwM2OpXY2WSbg7krW7 2I/yp6iqFJIU2rCfEXQFcDyUYmLHATae/AXLtZhw8EJbUqjr0bA/xp1NLTEdgQZeYy Tz8wUH1wHeEnIXtrUxY9RqgPgS4rx8fn7haijA02hKW2iguF7lEl2VJbKx2E5JQ9dk PrUMUo0oURbDLheqXXfeyY6pA0ObUo3g3d3ZahQGyGxY32/DsyKSs5nof1ZWrI130V S84l0gHSDnRnw== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Matthew Wilcox Cc: bpf@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Daniel Borkmann , Namhyung Kim Subject: [PATCH RFC v2 bpf-next 6/9] selftests/bpf: Add err.h header Date: Tue, 28 Feb 2023 10:32:03 +0100 Message-Id: <20230228093206.821563-7-jolsa@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230228093206.821563-1-jolsa@kernel.org> References: <20230228093206.821563-1-jolsa@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759067443362711379?= X-GMAIL-MSGID: =?utf-8?q?1759067443362711379?= Moving error macros from profiler.inc.h to new err.h header. It will be used in following changes. Signed-off-by: Jiri Olsa --- tools/testing/selftests/bpf/progs/err.h | 13 +++++++++++++ tools/testing/selftests/bpf/progs/profiler.inc.h | 3 +-- 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 tools/testing/selftests/bpf/progs/err.h diff --git a/tools/testing/selftests/bpf/progs/err.h b/tools/testing/selftests/bpf/progs/err.h new file mode 100644 index 000000000000..3ac6324da6fd --- /dev/null +++ b/tools/testing/selftests/bpf/progs/err.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __ERR_H__ +#define __ERR_H__ + +#define MAX_ERRNO 4095 +#define IS_ERR_VALUE(x) (unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO + +static inline int IS_ERR_OR_NULL(const void *ptr) +{ + return !ptr || IS_ERR_VALUE((unsigned long)ptr); +} + +#endif /* __ERR_H__ */ diff --git a/tools/testing/selftests/bpf/progs/profiler.inc.h b/tools/testing/selftests/bpf/progs/profiler.inc.h index 875513866032..f799d87e8700 100644 --- a/tools/testing/selftests/bpf/progs/profiler.inc.h +++ b/tools/testing/selftests/bpf/progs/profiler.inc.h @@ -6,6 +6,7 @@ #include #include "profiler.h" +#include "err.h" #ifndef NULL #define NULL 0 @@ -16,7 +17,6 @@ #define O_DIRECTORY 00200000 #define __O_TMPFILE 020000000 #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY) -#define MAX_ERRNO 4095 #define S_IFMT 00170000 #define S_IFSOCK 0140000 #define S_IFLNK 0120000 @@ -34,7 +34,6 @@ #define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK) #define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO) #define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK) -#define IS_ERR_VALUE(x) (unsigned long)(void*)(x) >= (unsigned long)-MAX_ERRNO #define KILL_DATA_ARRAY_SIZE 8 From patchwork Tue Feb 28 09:32:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 62371 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2915998wrd; Tue, 28 Feb 2023 01:44:24 -0800 (PST) X-Google-Smtp-Source: AK7set+OoA59Pq+KFOLEk5IHmJJ8hgW5p9Iv7vgl14XxYDxsiOP78ZPLZpGTyxOvzIVyXIIoAA0g X-Received: by 2002:a17:906:4942:b0:8aa:c0a4:2aa5 with SMTP id f2-20020a170906494200b008aac0a42aa5mr1536946ejt.16.1677577464567; Tue, 28 Feb 2023 01:44:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677577464; cv=none; d=google.com; s=arc-20160816; b=r8Bj4WAxDoZcf+O1LatQ0SZ04OvqB/bE96xgvidURWF846cHSNLYcNy+ASVNnMVZVY MBz3Uj+VvqlBKHnxduupngbEcVnbzZ70ZL8N4fgMtGbS5AY4ysKI/FiEPa7JMcWJaZRj bn23a5a7OnH8SRjz1XqyIbeVr5PeDBOdtMG5OCZwD5TImP3jt9+k2ImdagnZ+so1Ko5d vaQKkBWZOVKW3cd8NecVM+uuqDw8MPc+fsuSnLN6KG+1vS65MAnZckYKDReZe2oRT7AD Pu1LKFlUyTMdpif7kd+NYx4G2UltW/FVz01XU3Rjj7yxWP65VN/5KEO8wNj4NvqFaG5p 6+DQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=jl0OJ55Bdsy/x4nAfmUWGt6wf6plJ5POwKLopqD951c=; b=Aca/ve2YAwfvoPvOkkqwptGr81yX3rWaXS8Fpu0dG0bQAMJebM71IL3V7P4z20W54T Te2DohguPHeFjBUP+yq7dukfXHCKfV9iIG+lOV2ljHG1L2E1AWwm/EGBw5hbhnJNDFnH 9VH1On1n5foK6yzDfr6Y02wPocs0xK8wuGYHxdektAWXgOeCo7g8x5Sf2VxuqKRLwZg7 eR4lbbRuRij0E5VwMN4lJbXSq4Yo/LkgO4RmDrqdILA5qDon6k13Lh2X/oql1h/pHD29 H70xtUw2fFS9iQN22ouMM83xyfrxUQS03fEqol0oMMVelw7ZmKf7cuEtsRiRCWZ8B4gC 6sRg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=efKNf3cQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t16-20020a170906269000b008e86646e6c3si2357590ejc.896.2023.02.28.01.44.01; Tue, 28 Feb 2023 01:44:24 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=efKNf3cQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231389AbjB1JeE (ORCPT + 99 others); Tue, 28 Feb 2023 04:34:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50758 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231382AbjB1Jd4 (ORCPT ); Tue, 28 Feb 2023 04:33:56 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9E8867EFA; Tue, 28 Feb 2023 01:33:44 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2D51461027; Tue, 28 Feb 2023 09:33:44 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 84F41C433EF; Tue, 28 Feb 2023 09:33:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677576823; bh=PZiYSLYNU3C00rnNdy4zAar6CH7S8yCd0XJ4879uTP8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=efKNf3cQII98zFg4PhMr3l6nnP2Bi11i36Q8YZqlckFjvNF1u4nCZsZcwgao3hbXN 7keyPZK//616wp/cQBf2S67TLQk0VpSmxcTpWJqeHyCrlmVdTHrrWZSLIDh8Q2rm/3 Kw1FIcKTlTQ6yITPXO8YWISaeo3UK1z1axRxdcjyfgsbEGNlt9iLFMD71tjRTi8yCr 2UpDjk4+IjvYaoxHiW6xiHarbvTqYOSG2Xx8uYymD6VYYd12YIJSRLk/PovVSxZgnC 0+NwwZeaFF9Y8AVkN4d4ALReFAuvgzhYmEFgOVKW1Ob+W3uOyHKt4FOCyWmKyD2H4V wbq4k2glM0x+w== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Matthew Wilcox Cc: bpf@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Daniel Borkmann , Namhyung Kim Subject: [PATCH RFC v2 bpf-next 7/9] selftests/bpf: Replace extract_build_id with read_build_id Date: Tue, 28 Feb 2023 10:32:04 +0100 Message-Id: <20230228093206.821563-8-jolsa@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230228093206.821563-1-jolsa@kernel.org> References: <20230228093206.821563-1-jolsa@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759067467735311371?= X-GMAIL-MSGID: =?utf-8?q?1759067467735311371?= Replacing extract_build_id with read_build_id that parses out build id directly from elf without using readelf tool. Signed-off-by: Jiri Olsa Acked-by: Andrii Nakryiko --- .../bpf/prog_tests/stacktrace_build_id.c | 19 ++++++-------- .../bpf/prog_tests/stacktrace_build_id_nmi.c | 17 +++++-------- tools/testing/selftests/bpf/test_progs.c | 25 ------------------- tools/testing/selftests/bpf/test_progs.h | 1 - 4 files changed, 13 insertions(+), 49 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id.c b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id.c index 9ad09a6c538a..9e4b76ee356f 100644 --- a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id.c +++ b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id.c @@ -7,13 +7,12 @@ void test_stacktrace_build_id(void) int control_map_fd, stackid_hmap_fd, stackmap_fd, stack_amap_fd; struct test_stacktrace_build_id *skel; - int err, stack_trace_len; + int err, stack_trace_len, build_id_size; __u32 key, prev_key, val, duration = 0; - char buf[256]; - int i, j; + char buf[BPF_BUILD_ID_SIZE]; struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH]; int build_id_matches = 0; - int retry = 1; + int i, retry = 1; retry: skel = test_stacktrace_build_id__open_and_load(); @@ -52,9 +51,10 @@ void test_stacktrace_build_id(void) "err %d errno %d\n", err, errno)) goto cleanup; - err = extract_build_id(buf, 256); + build_id_size = read_build_id("./urandom_read", buf); + err = build_id_size < 0 ? build_id_size : 0; - if (CHECK(err, "get build_id with readelf", + if (CHECK(err, "read_build_id", "err %d errno %d\n", err, errno)) goto cleanup; @@ -64,8 +64,6 @@ void test_stacktrace_build_id(void) goto cleanup; do { - char build_id[64]; - err = bpf_map_lookup_elem(stackmap_fd, &key, id_offs); if (CHECK(err, "lookup_elem from stackmap", "err %d, errno %d\n", err, errno)) @@ -73,10 +71,7 @@ void test_stacktrace_build_id(void) for (i = 0; i < PERF_MAX_STACK_DEPTH; ++i) if (id_offs[i].status == BPF_STACK_BUILD_ID_VALID && id_offs[i].offset != 0) { - for (j = 0; j < 20; ++j) - sprintf(build_id + 2 * j, "%02x", - id_offs[i].build_id[j] & 0xff); - if (strstr(buf, build_id) != NULL) + if (memcmp(buf, id_offs[i].build_id, build_id_size) == 0) build_id_matches = 1; } prev_key = key; diff --git a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c index f4ea1a215ce4..8d84149ebcc7 100644 --- a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c +++ b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c @@ -28,11 +28,10 @@ void test_stacktrace_build_id_nmi(void) .config = PERF_COUNT_HW_CPU_CYCLES, }; __u32 key, prev_key, val, duration = 0; - char buf[256]; - int i, j; + char buf[BPF_BUILD_ID_SIZE]; struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH]; - int build_id_matches = 0; - int retry = 1; + int build_id_matches = 0, build_id_size; + int i, retry = 1; attr.sample_freq = read_perf_max_sample_freq(); @@ -94,7 +93,8 @@ void test_stacktrace_build_id_nmi(void) "err %d errno %d\n", err, errno)) goto cleanup; - err = extract_build_id(buf, 256); + build_id_size = read_build_id("./urandom_read", buf); + err = build_id_size < 0 ? build_id_size : 0; if (CHECK(err, "get build_id with readelf", "err %d errno %d\n", err, errno)) @@ -106,8 +106,6 @@ void test_stacktrace_build_id_nmi(void) goto cleanup; do { - char build_id[64]; - err = bpf_map__lookup_elem(skel->maps.stackmap, &key, sizeof(key), id_offs, sizeof(id_offs), 0); if (CHECK(err, "lookup_elem from stackmap", @@ -116,10 +114,7 @@ void test_stacktrace_build_id_nmi(void) for (i = 0; i < PERF_MAX_STACK_DEPTH; ++i) if (id_offs[i].status == BPF_STACK_BUILD_ID_VALID && id_offs[i].offset != 0) { - for (j = 0; j < 20; ++j) - sprintf(build_id + 2 * j, "%02x", - id_offs[i].build_id[j] & 0xff); - if (strstr(buf, build_id) != NULL) + if (memcmp(buf, id_offs[i].build_id, build_id_size) == 0) build_id_matches = 1; } prev_key = key; diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index 6d5e3022c75f..9813d53c4878 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -591,31 +591,6 @@ int compare_stack_ips(int smap_fd, int amap_fd, int stack_trace_len) return err; } -int extract_build_id(char *build_id, size_t size) -{ - FILE *fp; - char *line = NULL; - size_t len = 0; - - fp = popen("readelf -n ./urandom_read | grep 'Build ID'", "r"); - if (fp == NULL) - return -1; - - if (getline(&line, &len, fp) == -1) - goto err; - pclose(fp); - - if (len > size) - len = size; - memcpy(build_id, line, len); - build_id[len] = '\0'; - free(line); - return 0; -err: - pclose(fp); - return -1; -} - static int finit_module(int fd, const char *param_values, int flags) { return syscall(__NR_finit_module, fd, param_values, flags); diff --git a/tools/testing/selftests/bpf/test_progs.h b/tools/testing/selftests/bpf/test_progs.h index 9fbdc57c5b57..3825c2797a4b 100644 --- a/tools/testing/selftests/bpf/test_progs.h +++ b/tools/testing/selftests/bpf/test_progs.h @@ -404,7 +404,6 @@ static inline void *u64_to_ptr(__u64 ptr) int bpf_find_map(const char *test, struct bpf_object *obj, const char *name); int compare_map_keys(int map1_fd, int map2_fd); int compare_stack_ips(int smap_fd, int amap_fd, int stack_trace_len); -int extract_build_id(char *build_id, size_t size); int kern_sync_rcu(void); int trigger_module_test_read(int read_sz); int trigger_module_test_write(int write_sz); From patchwork Tue Feb 28 09:32:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 62372 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2916033wrd; Tue, 28 Feb 2023 01:44:30 -0800 (PST) X-Google-Smtp-Source: AK7set/N3CdMvWkfwtERbAGS5nVlfTtHNXr0PItkSJajG3NzadwvYEViCVL/2Fas71bcWpsO0rik X-Received: by 2002:a17:90b:1e4f:b0:237:161d:f5ac with SMTP id pi15-20020a17090b1e4f00b00237161df5acmr2697583pjb.36.1677577469782; Tue, 28 Feb 2023 01:44:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677577469; cv=none; d=google.com; s=arc-20160816; b=GVhjFaRNSbVXKSV1ziJhKxPOMA5OOfx1onom7lRBjikd2fZCYLCgOUgRfKCFeWL2k8 ArJhVUykvsKQNOniESrMB9rKkib+0uTnHRTrx0SJc/+oa2I0SlXEq1a05u+ksZvTCgry 9uVbuNE43T9C14NEeb+BKo61/LQBCB0HAe6nDaI86VpblNdaap8TBy5qZTz6bnlRjVZ8 /2DPlHurVl+0a/LPBS1l28iiWmFMYHnyvynS2Mk+/Lk9dx8cv2ZtpmgJqu6vS6tHLRTQ 8r3DInwpI0xyJLbhTRlzJ/x5H24pH99DAToU+JIpOWQ1oshKRZEfpxJOfzhE6BxPqX86 SEQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=S8zsSKGh/2jXDrNjaB7SvqeQhAYtVNh4DGtuLSrq7aE=; b=KbAMPp2HCJusKhEpKlquqQcVhUfjX65Xg7m8VvyWpvZo68B0d9Hz6UqWTWctGGEhrz FemCtZARjGQrPUNeTb/XIUgiNjapD+DVnsDhF5JlPHVdaNEsh1lwGlrYtp+cdIyjondu 0oXEz9eD3PCrkJ0xdXR7fasgg+By160DlGI2GP1MCf+I/FjVmFlMEkOa4jFLN2Zs9wtH wyNCmoxfdB/pBblMFlhm8cAY78G9NzHv/NYdnumsZkpXAALLGX9+UKVpD+EOcZFrAu7x cI0yQ7/aDevlH7o+hCrFbrMGwnvsDobI5vuyN4CWjQiXmbJm7u8XzW+OGwqkdBkXmV0p fL1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=CyNEGeiJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t70-20020a638149000000b00502f1a79abbsi9863857pgd.619.2023.02.28.01.44.16; Tue, 28 Feb 2023 01:44:29 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=CyNEGeiJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231388AbjB1JeS (ORCPT + 99 others); Tue, 28 Feb 2023 04:34:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50728 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231375AbjB1JeJ (ORCPT ); Tue, 28 Feb 2023 04:34:09 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 934772069E; Tue, 28 Feb 2023 01:33:57 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 1DFDD61027; Tue, 28 Feb 2023 09:33:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4462DC433D2; Tue, 28 Feb 2023 09:33:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677576836; bh=v7m3NBy45N+El792surZKP+8N2u7TLJVtr7h9aVoZ3A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CyNEGeiJh2hA0zwJNzVbvcRv6+QHDsr6iTjXBPAfvWILgkkPZYkyJWjabJgFTcgOz +tEugTlLcvM2FjUSspt2SZrIkU9+pvmpiBl5uTt7FuqPEN7vfyub3oHWfvuaqO9aSs Jmi26GTZAFipKJDW8bpPIsCZ4s20pU2eQaaPd6muUmEwKDazp16sZJLHI7p0M85fXk lS1p/MSgROM6HKQrNDqGsyhrIABsgqU4QshrTJNIVI519Tor+O7fWvS/tQkZoVR4wQ 74c9LC0+Og9JHKP8WxKXm91ifBrX/0gdPSBVu9EEp1wdP2NDpBoUNtRyK17iMJLJ3c EeioIfex1Td4g== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Matthew Wilcox Cc: bpf@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Daniel Borkmann , Namhyung Kim Subject: [PATCH RFC v2 bpf-next 8/9] selftests/bpf: Add inode_build_id test Date: Tue, 28 Feb 2023 10:32:05 +0100 Message-Id: <20230228093206.821563-9-jolsa@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230228093206.821563-1-jolsa@kernel.org> References: <20230228093206.821563-1-jolsa@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759067472854570495?= X-GMAIL-MSGID: =?utf-8?q?1759067472854570495?= The test attaches bpf program to sched_process_exec tracepoint and gets build of executed file from bprm->file->f_inode object. We use urandom_read as the test program and in addition we also attach uprobe to liburandom_read.so:urandlib_read_without_sema and retrieve and check build id of that shared library. Signed-off-by: Jiri Olsa --- .../selftests/bpf/prog_tests/inode_build_id.c | 68 +++++++++++++++++++ .../selftests/bpf/progs/inode_build_id.c | 62 +++++++++++++++++ tools/testing/selftests/bpf/test_progs.h | 10 +++ 3 files changed, 140 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/inode_build_id.c create mode 100644 tools/testing/selftests/bpf/progs/inode_build_id.c diff --git a/tools/testing/selftests/bpf/prog_tests/inode_build_id.c b/tools/testing/selftests/bpf/prog_tests/inode_build_id.c new file mode 100644 index 000000000000..d0add90f187d --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/inode_build_id.c @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include "inode_build_id.skel.h" +#include "trace_helpers.h" + +void test_inode_build_id(void) +{ + int go[2], err, child_pid, child_status, c = 1, sz; + char build_id[BPF_BUILD_ID_SIZE]; + struct inode_build_id *skel; + + skel = inode_build_id__open_and_load(); + if (!ASSERT_OK_PTR(skel, "inode_build_id__open_and_load")) + return; + + if (!ASSERT_OK(pipe(go), "pipe")) + goto out; + + child_pid = fork(); + if (child_pid < 0) + goto out; + + /* child */ + if (child_pid == 0) { + /* wait for parent's pid update */ + err = read(go[0], &c, 1); + if (!ASSERT_EQ(err, 1, "child_read_pipe")) + exit(err); + + execle("./urandom_read", "urandom_read", NULL, NULL); + exit(errno); + } + + /* parent, update child's pid and kick it */ + skel->bss->pid = child_pid; + + err = inode_build_id__attach(skel); + if (!ASSERT_OK(err, "inode_build_id__attach")) + goto out; + + err = write(go[1], &c, 1); + if (!ASSERT_EQ(err, 1, "child_write_pipe")) + goto out; + + /* wait for child to exit */ + waitpid(child_pid, &child_status, 0); + if (!ASSERT_EQ(WEXITSTATUS(child_status), 0, "child_exit_value")) + goto out; + + sz = read_build_id("./urandom_read", build_id); + if (!ASSERT_GT(sz, 0, "read_build_id")) + goto out; + + ASSERT_EQ(skel->bss->build_id_bin_size, sz, "build_id_bin_size"); + ASSERT_MEMEQ(skel->bss->build_id_bin, build_id, sz, "build_id_bin"); + + sz = read_build_id("./liburandom_read.so", build_id); + if (!ASSERT_GT(sz, 0, "read_build_id")) + goto out; + + ASSERT_EQ(skel->bss->build_id_lib_size, sz, "build_id_lib_size"); + ASSERT_MEMEQ(skel->bss->build_id_lib, build_id, sz, "build_id_lib"); + +out: + inode_build_id__destroy(skel); +} diff --git a/tools/testing/selftests/bpf/progs/inode_build_id.c b/tools/testing/selftests/bpf/progs/inode_build_id.c new file mode 100644 index 000000000000..eceb215b56b8 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/inode_build_id.c @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "vmlinux.h" +#include "err.h" +#include +#include +#include + +char _license[] SEC("license") = "GPL"; + +int pid; + +u32 build_id_bin_size; +u32 build_id_lib_size; + +char build_id_bin[20]; +char build_id_lib[20]; + +static int store_build_id(struct inode *inode, char *build_id, u32 *sz) +{ + struct build_id *bid; + + bid = inode->i_build_id; + if (IS_ERR_OR_NULL(bid)) + return 0; + *sz = bid->sz; + if (bid->sz > sizeof(bid->data)) + return 0; + __builtin_memcpy(build_id, bid->data, sizeof(bid->data)); + return 0; +} + +SEC("tp_btf/sched_process_exec") +int BPF_PROG(prog, struct task_struct *p, pid_t old_pid, struct linux_binprm *bprm) +{ + int cur_pid = bpf_get_current_pid_tgid() >> 32; + + if (pid != cur_pid) + return 0; + if (!bprm->file || !bprm->file->f_inode) + return 0; + return store_build_id(bprm->file->f_inode, build_id_bin, &build_id_bin_size); +} + +static long check_vma(struct task_struct *task, struct vm_area_struct *vma, + void *data) +{ + if (!vma || !vma->vm_file || !vma->vm_file->f_inode) + return 0; + return store_build_id(vma->vm_file->f_inode, build_id_lib, &build_id_lib_size); +} + +SEC("uprobe/liburandom_read.so:urandlib_read_without_sema") +int BPF_UPROBE(urandlib_read_without_sema) +{ + struct task_struct *task = bpf_get_current_task_btf(); + int cur_pid = bpf_get_current_pid_tgid() >> 32; + + if (pid != cur_pid) + return 0; + return bpf_find_vma(task, ctx->ip, check_vma, NULL, 0); +} diff --git a/tools/testing/selftests/bpf/test_progs.h b/tools/testing/selftests/bpf/test_progs.h index 3825c2797a4b..8156d6d4cb3b 100644 --- a/tools/testing/selftests/bpf/test_progs.h +++ b/tools/testing/selftests/bpf/test_progs.h @@ -310,6 +310,16 @@ int test__join_cgroup(const char *path); ___ok; \ }) +#define ASSERT_MEMEQ(actual, expected, sz, name) ({ \ + static int duration = 0; \ + const char *___act = actual; \ + const char *___exp = expected; \ + bool ___ok = memcmp(___act, ___exp, sz) == 0; \ + CHECK(!___ok, (name), \ + "unexpected %s does not match\n", (name)); \ + ___ok; \ +}) + #define ASSERT_STRNEQ(actual, expected, len, name) ({ \ static int duration = 0; \ const char *___act = actual; \ From patchwork Tue Feb 28 09:32:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 62375 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2916595wrd; Tue, 28 Feb 2023 01:45:46 -0800 (PST) X-Google-Smtp-Source: AK7set8A842Y3V9La7jeJo71S1QOpUjYo8dL9QDj05pl+y75z9woIBsl7tK9H8QIlsox+cm/D3J8 X-Received: by 2002:a17:902:ecc9:b0:19a:b7c0:f097 with SMTP id a9-20020a170902ecc900b0019ab7c0f097mr2460768plh.57.1677577545819; Tue, 28 Feb 2023 01:45:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677577545; cv=none; d=google.com; s=arc-20160816; b=sWsro3QPaXdoAc2SYdnVYvoXD4OmfAuq3pkS30LZNJ3Bqa8m61g6rNohjXELOd/+As wwI7RmqVQA3byn/xPkVvU0z2PSx8OrCwhvgq0jQDXyPiFLhJQwFrWcRJavvVDQcmKgyQ Cs+ipPdtRd/DddYkl2qZI8pTMlm62B7xfV70DMWIQovz+ybPzPLFKm4sbLYTij8zi78g dsSXFJPt/ob3Zfhp2DktiFJfsfhx/f81/iRslCantWGrecE70K5o8Yv84bnJGw/vyaDg JhyxwjNixXkncqgNKn+8m3IF4pLbPxIakmTLpfxSNr6l5ZzT52ybYgRgjq3d59P0lHdq gidQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=kIiOhB5XFH9ASOjhyNBa5Jjx1HYWCL1nsx7TAIeuG+s=; b=r70oatp99nLyoQWEnF8zkvS3FnifY+5bT70IiIpuhbn1L+FO6KnIiqtSP4ra4uUqeu cJv8+ukthkKAXV+IuB96brR7330FdhOJAK4VSgt5NYSz6PWo31ian603KWXPPetZhp+z MEekl1ovQ6UBIOQca26RbZJeZxCUQ5cRTpQ2DVVUdyhO+kmPjsEdMUByk2MZg1++D+ad oFmEOELO6GfCKqzXQSQzZy9KO267X1EkFr/HBEPY1aNwNChGKYzxbhRFyOjCH/KJ5xm4 00HYipUMWy+q8XKmzy91y5ePk/seWvmXw4u3DD9VpgppIdM2KPtLkbwqtk02r+bTTeLk Vp5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="kUEbZG/k"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w17-20020a170902e89100b0019a9f8bdba0si11224259plg.62.2023.02.28.01.45.33; Tue, 28 Feb 2023 01:45:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="kUEbZG/k"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231431AbjB1Jeg (ORCPT + 99 others); Tue, 28 Feb 2023 04:34:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51640 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231415AbjB1JeY (ORCPT ); Tue, 28 Feb 2023 04:34:24 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A1561CF52; Tue, 28 Feb 2023 01:34:10 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id F0F0C61027; Tue, 28 Feb 2023 09:34:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 555D7C433EF; Tue, 28 Feb 2023 09:34:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677576849; bh=GuLnU0d3k2V6ZdWnoPW82USn52Mxiiw398+O8RnbxjY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kUEbZG/k7LV/1mLXHeWWy8ByEFwfH8vr4ZFgj6lyjUX85YnoF9O+2SNLVfQ+BFZCK /C8zbSyBs0+Fgcg9S3mJ2CLktdsdjmUgSUhzqdyNcv7ycvIZ0OCbJwonyDI4shyNV5 ftTQF6r5HRAVPTY6qSwaMbTC+jiQDAFlvQxjT/tlM2rrxAwhsV4dC4XBD980wAL+mb tJpPPKnthTlBdWX5SGZewGddSsBTsAMcdvfZrdMbLb3WEcdYd1omjU9JoHFl2ZgqeI OJuG5BHYKrQ+D9+Yy/tYafMvA1FOw/NB91C6UneYdz+M7WN7WxroH3DaZIK9AeKVf7 ICF2YvbB5G38w== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Matthew Wilcox Cc: bpf@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Daniel Borkmann , Namhyung Kim Subject: [PATCH RFC v2 bpf-next 9/9] selftests/bpf: Add iter_task_vma_buildid test Date: Tue, 28 Feb 2023 10:32:06 +0100 Message-Id: <20230228093206.821563-10-jolsa@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230228093206.821563-1-jolsa@kernel.org> References: <20230228093206.821563-1-jolsa@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759067552725394313?= X-GMAIL-MSGID: =?utf-8?q?1759067552725394313?= Testing iterator access to build id in vma->vm_file->f_inode object by storing each binary with buildid into map and checking it against buildid retrieved in user space. Signed-off-by: Jiri Olsa --- .../selftests/bpf/prog_tests/bpf_iter.c | 78 +++++++++++++++++++ .../bpf/progs/bpf_iter_task_vma_buildid.c | 60 ++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/bpf_iter_task_vma_buildid.c diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c index 1f02168103dd..c7dd89e7cad0 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c @@ -33,6 +33,7 @@ #include "bpf_iter_bpf_link.skel.h" #include "bpf_iter_ksym.skel.h" #include "bpf_iter_sockmap.skel.h" +#include "bpf_iter_task_vma_buildid.skel.h" static int duration; @@ -1536,6 +1537,81 @@ static void test_task_vma_dead_task(void) bpf_iter_task_vma__destroy(skel); } +#define D_PATH_BUF_SIZE 1024 + +struct build_id { + u32 sz; + char data[BPF_BUILD_ID_SIZE]; +}; + +static void test_task_vma_buildid(void) +{ + int err, iter_fd = -1, proc_maps_fd = -1, sz; + struct bpf_iter_task_vma_buildid *skel; + char key[D_PATH_BUF_SIZE], *prev_key; + char build_id[BPF_BUILD_ID_SIZE]; + int len, files_fd, cnt = 0; + struct build_id val; + char c; + + skel = bpf_iter_task_vma_buildid__open_and_load(); + if (!ASSERT_OK_PTR(skel, "bpf_iter_task_vma_buildid__open_and_load")) + return; + + skel->links.proc_maps = bpf_program__attach_iter( + skel->progs.proc_maps, NULL); + + if (!ASSERT_OK_PTR(skel->links.proc_maps, "bpf_program__attach_iter")) { + skel->links.proc_maps = NULL; + goto out; + } + + iter_fd = bpf_iter_create(bpf_link__fd(skel->links.proc_maps)); + if (!ASSERT_GE(iter_fd, 0, "create_iter")) + goto out; + + /* trigger the iterator, there's no output, just map */ + len = read(iter_fd, &c, 1); + ASSERT_EQ(len, 0, "len_check"); + + files_fd = bpf_map__fd(skel->maps.files); + + prev_key = NULL; + + while (true) { + err = bpf_map_get_next_key(files_fd, prev_key, &key); + if (err) { + if (errno == ENOENT) + err = 0; + break; + } + if (bpf_map_lookup_elem(files_fd, key, &val)) + break; + if (!ASSERT_LE(val.sz, BPF_BUILD_ID_SIZE, "buildid_size")) + break; + + sz = read_build_id(key, build_id); + /* If there's an error, the build id is not present or malformed, kernel + * should see the same result and bpf program pushed zero build id. + */ + if (sz < 0) { + memset(build_id, 0x0, BPF_BUILD_ID_SIZE); + sz = BPF_BUILD_ID_SIZE; + } + ASSERT_EQ(val.sz, sz, "build_id_size"); + ASSERT_MEMEQ(val.data, build_id, sz, "build_id_data"); + + prev_key = key; + cnt++; + } + + printf("checked %d files\n", cnt); +out: + close(proc_maps_fd); + close(iter_fd); + bpf_iter_task_vma_buildid__destroy(skel); +} + void test_bpf_sockmap_map_iter_fd(void) { struct bpf_iter_sockmap *skel; @@ -1659,6 +1735,8 @@ void test_bpf_iter(void) test_task_vma(); if (test__start_subtest("task_vma_dead_task")) test_task_vma_dead_task(); + if (test__start_subtest("task_vma_buildid")) + test_task_vma_buildid(); if (test__start_subtest("task_btf")) test_task_btf(); if (test__start_subtest("tcp4")) diff --git a/tools/testing/selftests/bpf/progs/bpf_iter_task_vma_buildid.c b/tools/testing/selftests/bpf/progs/bpf_iter_task_vma_buildid.c new file mode 100644 index 000000000000..dc528a4783ec --- /dev/null +++ b/tools/testing/selftests/bpf/progs/bpf_iter_task_vma_buildid.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "bpf_iter.h" +#include "err.h" +#include +#include + +char _license[] SEC("license") = "GPL"; + +#define VM_EXEC 0x00000004 +#define D_PATH_BUF_SIZE 1024 + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 10000); + __type(key, char[D_PATH_BUF_SIZE]); + __type(value, struct build_id); +} files SEC(".maps"); + +static char path[D_PATH_BUF_SIZE]; +static struct build_id build_id; + +SEC("iter/task_vma") +int proc_maps(struct bpf_iter__task_vma *ctx) +{ + struct vm_area_struct *vma = ctx->vma; + struct seq_file *seq = ctx->meta->seq; + struct task_struct *task = ctx->task; + unsigned long file_key; + struct inode *inode; + struct file *file; + + if (task == (void *)0 || vma == (void *)0) + return 0; + + if (!(vma->vm_flags & VM_EXEC)) + return 0; + + file = vma->vm_file; + if (!file) + return 0; + + __builtin_memset(path, 0x0, D_PATH_BUF_SIZE); + bpf_d_path(&file->f_path, (char *) &path, D_PATH_BUF_SIZE); + + if (bpf_map_lookup_elem(&files, &path)) + return 0; + + inode = file->f_inode; + if (IS_ERR_OR_NULL(inode->i_build_id)) { + /* On error return empty build id. */ + __builtin_memset(&build_id.data, 0x0, sizeof(build_id.data)); + build_id.sz = 20; + } else { + __builtin_memcpy(&build_id, inode->i_build_id, sizeof(*inode->i_build_id)); + } + + bpf_map_update_elem(&files, &path, &build_id, 0); + return 0; +}