From patchwork Wed Feb 1 13:57:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Olsa X-Patchwork-Id: 13124347 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 35F10C05027 for ; Wed, 1 Feb 2023 13:58:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CAA436B0074; Wed, 1 Feb 2023 08:58:51 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id C5AC56B0078; Wed, 1 Feb 2023 08:58:51 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B235A6B007B; Wed, 1 Feb 2023 08:58:51 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id A52826B0074 for ; Wed, 1 Feb 2023 08:58:51 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 66C50160DCE for ; Wed, 1 Feb 2023 13:58:51 +0000 (UTC) X-FDA: 80418878862.14.AD27B7A Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by imf07.hostedemail.com (Postfix) with ESMTP id 888624000F for ; Wed, 1 Feb 2023 13:58:49 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="LqKng0t/"; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf07.hostedemail.com: domain of jolsa@kernel.org designates 145.40.68.75 as permitted sender) smtp.mailfrom=jolsa@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1675259929; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=+5JURJhGj2dii/qYo4MHbLNFqtPxIU98xUGfnte33fs=; b=JjLjGOy1tTyCq6Yak5XMDMpyol27kVWcXYV3vgCf00powIvEm/EZaXfJha5/9BsjBAhvV/ EB4F50SwDnqiv5N1Y6pPS6oz3Ta3W8HTdg05n0XYG3RMsYbMjxjx5ZZKien4G3TJ5huVAU daVnQ+85xqaQOAvuqbhorMRecSwaSpA= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="LqKng0t/"; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf07.hostedemail.com: domain of jolsa@kernel.org designates 145.40.68.75 as permitted sender) smtp.mailfrom=jolsa@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1675259929; a=rsa-sha256; cv=none; b=Cw1E2ZUX9eyFfjB5ynB0TUl7KIc9ok3giZADzcz+EeXMEgSJext0+tQXvczL18DZFp1Q0s hGXCrHOMJvMUL4B7cSJ8NS2X4K5vMC7BPmv5mS+dLjUE/qIKaW8UZVp888vgGcdPHaqUKq Q+qb7QO/4JYibeb8a2BBCoA2XDU1hRc= 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 27EA3B821A3; Wed, 1 Feb 2023 13:58:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2EF50C433D2; Wed, 1 Feb 2023 13:58:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1675259926; bh=jvbDTrnNM+LreSrCmODrWLU9QmeB7q7iDen40FPdj1A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LqKng0t/3ATi6UOExCOhJde1ApShlMSM63gX+vd3aJNmd6nbNk1OfdjWQmmtcMRVB jmYqD22jesz5ZbfQwbZusBGwAk89B6NyOQ2UyhQ3U0iUM/xWO3NmhyO1P5IPZUnhrJ toFQaOjvVDH3zkmtayUE0G6SDVxIg+Sflc2RcTDwMRFQ4E2JRQbAprzSCRJ7TQRJjO U0W/6fNliUadlcsU/Qq55Q9jn+zYw8zU2VWxd0M8WVTymkAiZCxpdma5L48bpNuRiV F2fMb5KRVubPmVaswcG81sgYbIINbZF+kDbyFhNWwap/Ndckh9rRlMBANWK7tKKaOJ xuEd+eLEGxI+A== From: Jiri Olsa To: Alexei Starovoitov , Andrii Nakryiko , Hao Luo , Andrew Morton , Alexander Viro , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo 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 Subject: [PATCH RFC 5/5] selftests/bpf: Add iter_task_vma_buildid test Date: Wed, 1 Feb 2023 14:57:37 +0100 Message-Id: <20230201135737.800527-6-jolsa@kernel.org> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230201135737.800527-1-jolsa@kernel.org> References: <20230201135737.800527-1-jolsa@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 888624000F X-Stat-Signature: ry8unoft5pxa88ug15hpaemo8psedsak X-HE-Tag: 1675259929-486780 X-HE-Meta: U2FsdGVkX1+YNQRbSey6jCF5Xg4XKFevI+5+Q2GWuVwAy95kLTOXHoSNCnT+qoMFTeFd2cqGLy6U7+afm384Kzq4kNkN7IWSh1cuadZF8XDTnnH6QqD8W5XIFJJmjhvvBjv2ohwb8be/lDJ+joGxGuOvgjNd4nGRyGAwznx1hfmBJnmb6u/bIASEJIX88tKoTvJe/3ifMwmQN+ztDPEY0fcsSNE+J5T8Y09lFxdc8ydXk1Dy6+sYXjKuviSD+kEnQffV2Kf+sbUop4DOKyWgnVJC95dSiZnR5Z9ZIJAYvCVGoidtYCUZDHsUFfIn4L0NsntFec9XZBbd+Sb5FS3ghdaF36lTbnTkRR6xmaWXG3+x3dlQ5aKjrkk+Gq17ndjuUySncdn7b7I6Y9vqxJ2rs+JWY6VauQNI9m4p+Ew6PcSZaHebL6CKFs3O+HTA4dRmGQ7VcIk7Ai5b3CF8zwXHMk5paybRGgf18onX4iw05Qj8KilEudMVZ1bavEaj/5ovHaeMOxskvlWVhkXQGeRsrgkYid6g7ch3MZLgl4Hdc30mlHRKe+Ggt1U3gaOXMQl9Zsj/JY2cEc1Q1725BlzzMvaMc421+0frJQsVu4Pi1uwMzQuPHT1E0TbNlcrY9vxxPL7dRw7jChlGLFnY5QZ1J+VTl9EDTycORS2Nx+43QwaQYpvJh0AFvzo2wNrVZkbGj+tYVJzK0p9avqTJatSSepKBrkSCoGX4UqJ1VljkJo1mR169YG7j57dbL9MxvY0UfL1Q7i9yLTc0Mek99BS+lNpdDMMFmXScxfIw//G6F00hNIYGLRgnadQA8CimQ3manooWD+6RiFsm9Sd3JZItLlZICqD52R3M88Pgmo/QR7tccWU0xOZk0ZDcJ0W38/BClDXkhBZCKQ3uuqyByo311Zr7Uw515fi0WtzOPEuCtrCVFvNXn8WC6xDXlS4gPPTB7Zn0XjnMB8P3K4eVWK5 fhvNqC9L seh1VrgyCQ86pLULSfy/C1QWk8YnQIDYndW9AEbKKri8YPWwoCd+CZ9D2DcjBrY0AkiYdmvTj+AZf3OLLAoCYFtalbdNO6tnp12/lfNTD3QYpdA8ZQDjqWX6PZWwPunLgVNmBghdavywE+zmmf6O/0pQyYUlfOPmjEQDc+HNFLpEVHziusjI26j1SY18QIiM0C1sILTVD5XkoiVMbOY/9qHXppkIZQ0OcKXS9wOs/xje9sTmsQKqWpBkXmoiIKVfCGjxS1Go4JUFu9YvipB0aMRRGGqoipjmo1GsKoArg2XYYbykvKrAaiXDytvw5xGHdo2jb02flxZ+2n05yzxIQuEhgg6R+WrNWCTuCXzGSUZaG7QWa95oghjyEpcAPkW8b4GnXUzdHonke2bW8AQwo1dRxb6FPFusMcoZJTX5MFJocoQ7CP7B3tr5hG7STTSg16Znk/smz9u7QI3/NXpWretzjIlSjWcL9Qjdz 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: Testing iterator access to build id in vma->vm_file 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 | 88 +++++++++++++++++++ .../bpf/progs/bpf_iter_task_vma_buildid.c | 49 +++++++++++ 2 files changed, 137 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 3af6450763e9..fd3217b68c2e 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,91 @@ static void test_task_vma_dead_task(void) bpf_iter_task_vma__destroy(skel); } +#define D_PATH_BUF_SIZE 1024 +#define BUILD_ID_SIZE_MAX 20 + +struct build_id { + u32 sz; + char data[BUILD_ID_SIZE_MAX]; +}; + +#define BUILDID_STR_SIZE (BPF_BUILD_ID_SIZE*2 + 1) + +static void test_task_vma_buildid(void) +{ + int err, iter_fd = -1, proc_maps_fd = -1; + struct bpf_iter_task_vma_buildid *skel; + char key[D_PATH_BUF_SIZE], *prev_key; + char bpf_build_id[BUILDID_STR_SIZE]; + int len, files_fd, i, cnt = 0; + struct build_id val; + char *build_id; + char c; + + skel = bpf_iter_task_vma_buildid__open(); + if (!ASSERT_OK_PTR(skel, "bpf_iter_task_vma_buildid__open")) + return; + + err = bpf_iter_task_vma_buildid__load(skel); + if (!ASSERT_OK(err, "bpf_iter_task_vma_buildid__load")) + goto out; + + 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, BUILD_ID_SIZE_MAX, "buildid_size")) + break; + + memset(bpf_build_id, 0x0, sizeof(bpf_build_id)); + for (i = 0; i < val.sz; i++) { + sprintf(bpf_build_id + i*2, "%02x", + (unsigned char) val.data[i]); + } + + if (!ASSERT_OK(read_buildid(key, &build_id), "read_buildid")) + break; + + printf("BUILDID %s %s %s\n", bpf_build_id, build_id, key); + ASSERT_OK(strncmp(bpf_build_id, build_id, strlen(bpf_build_id)), "buildid_cmp"); + + free(build_id); + 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 +1745,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..25e2179ae5f4 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/bpf_iter_task_vma_buildid.c @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "bpf_iter.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 tmp_key[D_PATH_BUF_SIZE]; +static struct build_id tmp_data; + +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 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; + + memset(tmp_key, 0x0, D_PATH_BUF_SIZE); + bpf_d_path(&file->f_path, (char *) &tmp_key, D_PATH_BUF_SIZE); + + if (bpf_map_lookup_elem(&files, &tmp_key)) + return 0; + + memcpy(&tmp_data, file->f_bid, sizeof(*file->f_bid)); + bpf_map_update_elem(&files, &tmp_key, &tmp_data, 0); + return 0; +}