From nobody Fri Dec 19 13:42:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29E7019D074; Mon, 26 Aug 2024 22:10:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724710248; cv=none; b=SP+KSmNs6iG7M7qW5rbReB0/jUSGhtQ2IySl+unVBUBN4Pc2v3qmk2N1b9b4W1mSWMi8+fzJQcHMgJjeNJKdCW+olj49iuuDOuTFXjwHsDcJaOWBLmhx1nyDxL3+ht0UgngrwZgOk86sRxBpAgfX/KKAmfzCmgw9EJHU77hSlt4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724710248; c=relaxed/simple; bh=eg+RpaI+kxukrhpWwDABFKaS8hD7evFQFlWQc7pH2CE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BSixNEyPZzhH0V5QOaShZHEYmhs5Iapxh1/N8bOf54T3MbfWtDC56t0OPJITs7iLfXpzxsef7j0h2oX6aQuxA8NOOOhxyaKEs4pXC1P16siLorBwSpV9SMvgav2yzssPmzWhbF2YYY8Joeolf4Q4GYNPVuZny1aJnZwLYzQLKZI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OcfsNLUh; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OcfsNLUh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2E749C8B7C6; Mon, 26 Aug 2024 22:10:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724710247; bh=eg+RpaI+kxukrhpWwDABFKaS8hD7evFQFlWQc7pH2CE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OcfsNLUhDEEjvOhm4td22x9YiGv9VIgRBmVFRLr/Ge5m93hFZOZCVXx2Sm/Iei4VD x588O+xBt/ngYnqXvnTF93ZIeM3D4StFpfJNTF2NokDlVqchub/h+Ktq30pN1msony ySqvvAKwF/GUIJU2HxWzmru2zWOoeKgcVGRiOl8yV2hHQhj/bledJsZCdN+GUky+gh Md4b/hM5+r5o6rI70oWTSdH29bLMGTs55iXd6BuIvIKBVAG6hYvoYszcq5OjtwIQeu t2jPfct1EVEYGnSbjQYjHBDonSxQUuovbatsTkBhbV6Qx2TLwBIfFd+aP87JgGZEnH 9+rBsmleiXVXA== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian , Matt Fleming Subject: [PATCH 1/4] perf report: Fix segfault when 'sym' sort key is not used Date: Mon, 26 Aug 2024 15:10:42 -0700 Message-ID: <20240826221045.1202305-2-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.295.g3b9ea8a38a-goog In-Reply-To: <20240826221045.1202305-1-namhyung@kernel.org> References: <20240826221045.1202305-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The fields in the hist_entry are filled on-demand which means they only have meaningful values when relevant sort keys are used. So if neither of 'dso' nor 'sym' sort keys are used, the map/symbols in the hist entry can be garbage. So it shouldn't access it unconditionally. I got a segfault, when I wanted to see cgroup profiles. $ sudo perf record -a --all-cgroups --synth=3Dcgroup true $ sudo perf report -s cgroup Program received signal SIGSEGV, Segmentation fault. 0x00005555557a8d90 in map__dso (map=3D0x0) at util/map.h:48 48 return RC_CHK_ACCESS(map)->dso; (gdb) bt #0 0x00005555557a8d90 in map__dso (map=3D0x0) at util/map.h:48 #1 0x00005555557aa39b in map__load (map=3D0x0) at util/map.c:344 #2 0x00005555557aa592 in map__find_symbol (map=3D0x0, addr=3D14073611594= 1088) at util/map.c:385 #3 0x00005555557ef000 in hists__findnew_entry (hists=3D0x555556039d60, e= ntry=3D0x7fffffffa4c0, al=3D0x7fffffffa8c0, sample_self=3Dtrue) at util/hist.c:644 #4 0x00005555557ef61c in __hists__add_entry (hists=3D0x555556039d60, al= =3D0x7fffffffa8c0, sym_parent=3D0x0, bi=3D0x0, mi=3D0x0, ki=3D0x0, block_info=3D0x0, sample=3D0x7fffffffaa90, sample_self=3Dtrue, ops=3D= 0x0) at util/hist.c:761 #5 0x00005555557ef71f in hists__add_entry (hists=3D0x555556039d60, al=3D= 0x7fffffffa8c0, sym_parent=3D0x0, bi=3D0x0, mi=3D0x0, ki=3D0x0, sample=3D0x7fffffffaa90, sample_self=3Dtrue) at util/hist.c:779 #6 0x00005555557f00fb in iter_add_single_normal_entry (iter=3D0x7fffffff= a900, al=3D0x7fffffffa8c0) at util/hist.c:1015 #7 0x00005555557f09a7 in hist_entry_iter__add (iter=3D0x7fffffffa900, al= =3D0x7fffffffa8c0, max_stack_depth=3D127, arg=3D0x7fffffffbce0) at util/hist.c:1260 #8 0x00005555555ba7ce in process_sample_event (tool=3D0x7fffffffbce0, ev= ent=3D0x7ffff7c14128, sample=3D0x7fffffffaa90, evsel=3D0x555556039ad0, machine=3D0x5555560388e8) at builtin-report.c:334 #9 0x00005555557b30c8 in evlist__deliver_sample (evlist=3D0x555556039010= , tool=3D0x7fffffffbce0, event=3D0x7ffff7c14128, sample=3D0x7fffffffaa90, evsel=3D0x555556039ad0, machine=3D0x55555603= 88e8) at util/session.c:1232 #10 0x00005555557b32bc in machines__deliver_event (machines=3D0x555556038= 8e8, evlist=3D0x555556039010, event=3D0x7ffff7c14128, sample=3D0x7fffffffaa90, tool=3D0x7fffffffbce0, file_offset=3D110888,= file_path=3D0x555556038ff0 "perf.data") at util/session.c:1271 #11 0x00005555557b3848 in perf_session__deliver_event (session=3D0x555556= 0386d0, event=3D0x7ffff7c14128, tool=3D0x7fffffffbce0, file_offset=3D110888, file_path=3D0x555556038ff0 "perf.data") at util= /session.c:1354 #12 0x00005555557affaf in ordered_events__deliver_event (oe=3D0x555556038= e60, event=3D0x555556135aa0) at util/session.c:132 #13 0x00005555557bb605 in do_flush (oe=3D0x555556038e60, show_progress=3D= false) at util/ordered-events.c:245 #14 0x00005555557bb95c in __ordered_events__flush (oe=3D0x555556038e60, h= ow=3DOE_FLUSH__ROUND, timestamp=3D0) at util/ordered-events.c:324 #15 0x00005555557bba46 in ordered_events__flush (oe=3D0x555556038e60, how= =3DOE_FLUSH__ROUND) at util/ordered-events.c:342 #16 0x00005555557b1b3b in perf_event__process_finished_round (tool=3D0x7f= ffffffbce0, event=3D0x7ffff7c15bb8, oe=3D0x555556038e60) at util/session.c:780 #17 0x00005555557b3b27 in perf_session__process_user_event (session=3D0x5= 555560386d0, event=3D0x7ffff7c15bb8, file_offset=3D117688, file_path=3D0x555556038ff0 "perf.data") at util/session.c:1406 As you can see the entry->ms.map was NULL even if he->ms.map has a value. This is because 'sym' sort key is not given, so it cannot assume whether he->ms.sym and entry->ms.sym is the same. I only checked the 'sym' sort key here as it implies 'dso' behavior (so maps are the same). Fixes: ac01c8c42465 ("perf hist: Update hist symbol when updating maps") Cc: Matt Fleming Signed-off-by: Namhyung Kim --- tools/perf/util/hist.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index dadce2889e52..f387e85a0087 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -638,7 +638,7 @@ static struct hist_entry *hists__findnew_entry(struct h= ists *hists, * mis-adjust symbol addresses when computing * the history counter to increment. */ - if (he->ms.map !=3D entry->ms.map) { + if (hists__has(hists, sym) && he->ms.map !=3D entry->ms.map) { if (he->ms.sym) { u64 addr =3D he->ms.sym->start; he->ms.sym =3D map__find_symbol(entry->ms.map, addr); --=20 2.46.0.295.g3b9ea8a38a-goog From nobody Fri Dec 19 13:42:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9418919D082; Mon, 26 Aug 2024 22:10:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724710248; cv=none; b=aLTMosac3AAln2rYb9yaUzO51IjOd8ZnZUF0u6TypGLzzvtdhM7oFhh/uRcxpxJcLZVMIsCFyu5ZW0vzhEBKp1B7JjZvCpLgQ2VMW6UKa2KTNZXKOiXl4aQELZH0GQunQboA32UJItnPnrL4nrl4fWjExlxWIWStG/bRNgIPdVQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724710248; c=relaxed/simple; bh=C5ZJ+orkYSjjfOqZKUEsjhgj6GSofEI+72XLr0ut0ZQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NCUp1Zcio4nYg+xRmGMZprKqTiH/u6fEJgJ3Ik9fo8DFTbAa6lPMv99xrqEpp5G40E2UT1wZ2mwG9uHCoPUejWViejx++zEuCCenpcgtnyHj9fJ7VJYzwEXnigAHvlynplgrIm2ZPMNa8Uwwxu1Q9PSpDN4AetSNp9CEL5Ir0fk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PRRU680C; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PRRU680C" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BC200C8B7B7; Mon, 26 Aug 2024 22:10:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724710248; bh=C5ZJ+orkYSjjfOqZKUEsjhgj6GSofEI+72XLr0ut0ZQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PRRU680CXdCQFuCnfSFdYUfg+YqPTGwSUPYX3EPIsgwMK+3LKoJE0vln7ViHh0MxI vk6E+yQcU5asMw5umh2x8yDIiX696YDte7nKxkJhg1KVZRqHESLV4dJ5snG1NyJm28 /Uy35BEt3WQuDAu+2xWuIEvFrZyywHHjt2LGMP1Hd4l7rc+y919hYrdH+5pIrXQXFv L2HRGZbIlnGNF40E43KO/rpHwOS0BF3tYoHkOrww3SYOp+g6sSSpzbagZOgXxC2j9K u3yOU8DCRsq3IaBNbfvxtcQFSJIBPZzAFOnxvJ/zcJpBK3AVAMu7juwvCL9epmpO+m 7R32YuhYYY6UA== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian Subject: [PATCH 2/4] perf bpf-filter: Add build dependency to header files Date: Mon, 26 Aug 2024 15:10:43 -0700 Message-ID: <20240826221045.1202305-3-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.295.g3b9ea8a38a-goog In-Reply-To: <20240826221045.1202305-1-namhyung@kernel.org> References: <20240826221045.1202305-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The flex and bison files need to be recompiled when one of these header filters are changed. * util/bpf-filter.h * util/bpf_skel/sample-filter.h Signed-off-by: Namhyung Kim --- tools/perf/util/Build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/Build b/tools/perf/util/Build index b87f918bdfe7..260cec2f6c0b 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -278,12 +278,12 @@ $(OUTPUT)util/pmu-bison.c $(OUTPUT)util/pmu-bison.h: = util/pmu.y $(Q)$(call echo-cmd,bison)$(BISON) -v $< -d $(PARSER_DEBUG_BISON) $(BISON= _FILE_PREFIX_MAP) \ -o $(OUTPUT)util/pmu-bison.c -p perf_pmu_ =20 -$(OUTPUT)util/bpf-filter-flex.c $(OUTPUT)util/bpf-filter-flex.h: util/bpf-= filter.l $(OUTPUT)util/bpf-filter-bison.c +$(OUTPUT)util/bpf-filter-flex.c $(OUTPUT)util/bpf-filter-flex.h: util/bpf-= filter.l $(OUTPUT)util/bpf-filter-bison.c util/bpf-filter.h util/bpf_skel/s= ample-filter.h $(call rule_mkdir) $(Q)$(call echo-cmd,flex)$(FLEX) -o $(OUTPUT)util/bpf-filter-flex.c \ --header-file=3D$(OUTPUT)util/bpf-filter-flex.h $(PARSER_DEBUG_FLEX) $< =20 -$(OUTPUT)util/bpf-filter-bison.c $(OUTPUT)util/bpf-filter-bison.h: util/bp= f-filter.y +$(OUTPUT)util/bpf-filter-bison.c $(OUTPUT)util/bpf-filter-bison.h: util/bp= f-filter.y util/bpf-filter.h util/bpf_skel/sample-filter.h $(call rule_mkdir) $(Q)$(call echo-cmd,bison)$(BISON) -v $< -d $(PARSER_DEBUG_BISON) $(BISON= _FILE_PREFIX_MAP) \ -o $(OUTPUT)util/bpf-filter-bison.c -p perf_bpf_filter_ --=20 2.46.0.295.g3b9ea8a38a-goog From nobody Fri Dec 19 13:42:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C0BBD19D095; Mon, 26 Aug 2024 22:10:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724710248; cv=none; b=S7PbEAnA83NTyT3lIwM887Q8CXIkdFUEKezLhfgguqk7KmhT6e6hCUW8jxAd0pur799WpCjS49k2c3pAxQ9icTyUCbKRnwQ8P8gGVnoOWyvb0sI8CYWB9todIOf4xJ3sl/QN6t81XB1mwg9K48f+9l41VSuk565YJlpLoKEFkjA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724710248; c=relaxed/simple; bh=Qdgofb7vp62wStMKGFnw4VWBW7ZkAIyyM4zGeyvSIgg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uTOoGnI8shDsXdYZmlF5vaMsorpLVlE5sEkZjqnyua2aGQQn9LpRUj/6jNg+hCxjj7BWuRUMjdM1qTjy/xw00Rw+eza6v/4vEUqBaLULj5wvofXqmvjv1tygLv6Go0+25UhNMMw1gFL6WVQwQvh5YTO5+pzivFlKsJEb9jmQz/8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JZZQwuJA; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JZZQwuJA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 49BB7C8B7DB; Mon, 26 Aug 2024 22:10:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724710248; bh=Qdgofb7vp62wStMKGFnw4VWBW7ZkAIyyM4zGeyvSIgg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JZZQwuJAIwXSv3lDa40afhaM/OGW5O/Q9JLHW9E/IUjv0QnFdfjBzTl0S356KKGUx WFOm95FWbUsEX1lKNOGziSLcQNbAfEVN0kc55O2ONkuRJCpPurggv41VD8E+iSZ0mz POYHZZGtkrAvBng4ByXvxYuFxUT2QG76vuTIIpLxXkynBG7J/nxDQU+9TRS2GzG4ZJ yBGBM3cJEDANkcIaKVY2kH0LDKF8xti+DemqHvMLuN65BjkgnLFgXxOriw2Wqyrv/Q 01TitS0ebtoTU/N8S5vQBgh/aP69beDra/mtcKyAXvgoGAxqjmNI3Izc6yp1Z947Oa s/qyD/AfAm+Fw== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian Subject: [PATCH 3/4] perf bpf-filter: Support filtering on cgroups Date: Mon, 26 Aug 2024 15:10:44 -0700 Message-ID: <20240826221045.1202305-4-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.295.g3b9ea8a38a-goog In-Reply-To: <20240826221045.1202305-1-namhyung@kernel.org> References: <20240826221045.1202305-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The new cgroup filter can take either of '=3D=3D' or '!=3D' operator and a pathname for the target cgroup. $ perf record -a --all-cgroups -e cycles --filter 'cgroup =3D=3D /abc/def= ' -- sleep 1 Users should have --all-cgroups option in the command line to enable cgroup filtering. Technically it doesn't need to have the option as it can get the current task's cgroup info directly from BPF. But I want to follow the convention for the other sample info. Signed-off-by: Namhyung Kim --- tools/perf/util/bpf-filter.c | 1 + tools/perf/util/bpf-filter.l | 28 ++++++++++++++++---- tools/perf/util/bpf-filter.y | 28 ++++++++++++++++++-- tools/perf/util/bpf_skel/sample-filter.h | 2 +- tools/perf/util/bpf_skel/sample_filter.bpf.c | 4 ++- tools/perf/util/bpf_skel/vmlinux/vmlinux.h | 1 + 6 files changed, 55 insertions(+), 9 deletions(-) diff --git a/tools/perf/util/bpf-filter.c b/tools/perf/util/bpf-filter.c index 0a1832564dd2..e87b6789eb9e 100644 --- a/tools/perf/util/bpf-filter.c +++ b/tools/perf/util/bpf-filter.c @@ -100,6 +100,7 @@ static const struct perf_sample_info { PERF_SAMPLE_TYPE(TRANSACTION, "--transaction"), PERF_SAMPLE_TYPE(CODE_PAGE_SIZE, "--code-page-size"), PERF_SAMPLE_TYPE(DATA_PAGE_SIZE, "--data-page-size"), + PERF_SAMPLE_TYPE(CGROUP, "--all-cgroups"), }; =20 static int get_pinned_fd(const char *name); diff --git a/tools/perf/util/bpf-filter.l b/tools/perf/util/bpf-filter.l index 2a7c839f3fae..f313404f95a9 100644 --- a/tools/perf/util/bpf-filter.l +++ b/tools/perf/util/bpf-filter.l @@ -9,8 +9,11 @@ #include "bpf-filter.h" #include "bpf-filter-bison.h" =20 +extern int perf_bpf_filter_needs_path; + static int sample(enum perf_bpf_filter_term term) { + perf_bpf_filter_needs_path =3D 0; perf_bpf_filter_lval.sample.term =3D term; perf_bpf_filter_lval.sample.part =3D 0; return BFT_SAMPLE; @@ -18,11 +21,20 @@ static int sample(enum perf_bpf_filter_term term) =20 static int sample_part(enum perf_bpf_filter_term term, int part) { + perf_bpf_filter_needs_path =3D 0; perf_bpf_filter_lval.sample.term =3D term; perf_bpf_filter_lval.sample.part =3D part; return BFT_SAMPLE; } =20 +static int sample_path(enum perf_bpf_filter_term term) +{ + perf_bpf_filter_needs_path =3D 1; + perf_bpf_filter_lval.sample.term =3D term; + perf_bpf_filter_lval.sample.part =3D 0; + return BFT_SAMPLE_PATH; +} + static int operator(enum perf_bpf_filter_op op) { perf_bpf_filter_lval.op =3D op; @@ -48,10 +60,15 @@ static int constant(int val) return BFT_NUM; } =20 -static int error(const char *str) +static int path_or_error(void) { - printf("perf_bpf_filter: Unexpected filter %s: %s\n", str, perf_bpf_filte= r_text); - return BFT_ERROR; + if (!perf_bpf_filter_needs_path) { + printf("perf_bpf_filter: Error: Unexpected item: %s\n", + perf_bpf_filter_text); + return BFT_ERROR; + } + perf_bpf_filter_lval.path =3D perf_bpf_filter_text; + return BFT_PATH; } =20 %} @@ -59,6 +76,7 @@ static int error(const char *str) num_dec [0-9]+ num_hex 0[Xx][0-9a-fA-F]+ space [ \t]+ +path [^ \t\n]+ ident [_a-zA-Z][_a-zA-Z0-9]+ =20 %% @@ -97,6 +115,7 @@ mem_blk { return sample_part(PBF_TERM_DATA_SRC, 7); } mem_hops { return sample_part(PBF_TERM_DATA_SRC, 8); } uid { return sample(PBF_TERM_UID); } gid { return sample(PBF_TERM_GID); } +cgroup { return sample_path(PBF_TERM_CGROUP); } =20 "=3D=3D" { return operator(PBF_OP_EQ); } "!=3D" { return operator(PBF_OP_NEQ); } @@ -155,7 +174,6 @@ hops3 { return constant(PERF_MEM_HOPS_3); } "," { return ','; } "||" { return BFT_LOGICAL_OR; } =20 -{ident} { return error("ident"); } -. { return error("input"); } +{path} { return path_or_error(); } =20 %% diff --git a/tools/perf/util/bpf-filter.y b/tools/perf/util/bpf-filter.y index 0c56fccb8874..5a79a8e7a45b 100644 --- a/tools/perf/util/bpf-filter.y +++ b/tools/perf/util/bpf-filter.y @@ -12,9 +12,13 @@ #include #include #include "bpf-filter.h" +#include "cgroup.h" =20 int perf_bpf_filter_lex(void); =20 +/* To indicate if the current term needs a pathname or not */ +int perf_bpf_filter_needs_path; + static void perf_bpf_filter_error(struct list_head *expr __maybe_unused, char const *msg) { @@ -26,6 +30,7 @@ static void perf_bpf_filter_error(struct list_head *expr = __maybe_unused, %union { unsigned long num; + char *path; struct { enum perf_bpf_filter_term term; int part; @@ -34,12 +39,13 @@ static void perf_bpf_filter_error(struct list_head *exp= r __maybe_unused, struct perf_bpf_filter_expr *expr; } =20 -%token BFT_SAMPLE BFT_OP BFT_ERROR BFT_NUM BFT_LOGICAL_OR +%token BFT_SAMPLE BFT_SAMPLE_PATH BFT_OP BFT_ERROR BFT_NUM BFT_LOGICAL_OR = BFT_PATH %type filter_term filter_expr %destructor { free ($$); } -%type BFT_SAMPLE +%type BFT_SAMPLE BFT_SAMPLE_PATH %type BFT_OP %type BFT_NUM +%type BFT_PATH =20 %% =20 @@ -81,5 +87,23 @@ BFT_SAMPLE BFT_OP BFT_NUM { $$ =3D perf_bpf_filter_expr__new($1.term, $1.part, $2, $3); } +| +BFT_SAMPLE_PATH BFT_OP BFT_PATH +{ + struct cgroup *cgrp; + unsigned long cgroup_id =3D 0; + + if ($2 !=3D PBF_OP_EQ && $2 !=3D PBF_OP_NEQ) { + printf("perf_bpf_filter: cgroup accepts '=3D=3D' or '!=3D' only\n"); + YYERROR; + } + + cgrp =3D cgroup__new($3, /*do_open=3D*/false); + if (cgrp && read_cgroup_id(cgrp) =3D=3D 0) + cgroup_id =3D cgrp->id; + + $$ =3D perf_bpf_filter_expr__new($1.term, $1.part, $2, cgroup_id); + cgroup__put(cgrp); +} =20 %% diff --git a/tools/perf/util/bpf_skel/sample-filter.h b/tools/perf/util/bpf= _skel/sample-filter.h index 5f0c8e4e83d3..683fec85e71e 100644 --- a/tools/perf/util/bpf_skel/sample-filter.h +++ b/tools/perf/util/bpf_skel/sample-filter.h @@ -45,7 +45,7 @@ enum perf_bpf_filter_term { __PBF_UNUSED_TERM18 =3D PBF_TERM_SAMPLE_START + 18, /* SAMPLE_REGS_INTR = =3D 1U << 18 */ PBF_TERM_PHYS_ADDR =3D PBF_TERM_SAMPLE_START + 19, /* SAMPLE_PHYS_ADDR = =3D 1U << 19 */ __PBF_UNUSED_TERM20 =3D PBF_TERM_SAMPLE_START + 20, /* SAMPLE_AUX =3D 1U = << 20 */ - __PBF_UNUSED_TERM21 =3D PBF_TERM_SAMPLE_START + 21, /* SAMPLE_CGROUP =3D = 1U << 21 */ + PBF_TERM_CGROUP =3D PBF_TERM_SAMPLE_START + 21, /* SAMPLE_CGROUP =3D 1U = << 21 */ PBF_TERM_DATA_PAGE_SIZE =3D PBF_TERM_SAMPLE_START + 22, /* SAMPLE_DATA_PA= GE_SIZE =3D 1U << 22 */ PBF_TERM_CODE_PAGE_SIZE =3D PBF_TERM_SAMPLE_START + 23, /* SAMPLE_CODE_PA= GE_SIZE =3D 1U << 23 */ PBF_TERM_WEIGHT_STRUCT =3D PBF_TERM_SAMPLE_START + 24, /* SAMPLE_WEIGHT_S= TRUCT =3D 1U << 24 */ diff --git a/tools/perf/util/bpf_skel/sample_filter.bpf.c b/tools/perf/util= /bpf_skel/sample_filter.bpf.c index 4872a16eedfd..b195e6efeb8b 100644 --- a/tools/perf/util/bpf_skel/sample_filter.bpf.c +++ b/tools/perf/util/bpf_skel/sample_filter.bpf.c @@ -93,6 +93,7 @@ static inline __u64 perf_get_sample(struct bpf_perf_event= _data_kern *kctx, BUILD_CHECK_SAMPLE(DATA_SRC); BUILD_CHECK_SAMPLE(TRANSACTION); BUILD_CHECK_SAMPLE(PHYS_ADDR); + BUILD_CHECK_SAMPLE(CGROUP); BUILD_CHECK_SAMPLE(DATA_PAGE_SIZE); BUILD_CHECK_SAMPLE(CODE_PAGE_SIZE); BUILD_CHECK_SAMPLE(WEIGHT_STRUCT); @@ -135,6 +136,8 @@ static inline __u64 perf_get_sample(struct bpf_perf_eve= nt_data_kern *kctx, return kctx->data->weight.full; case PBF_TERM_PHYS_ADDR: return kctx->data->phys_addr; + case PBF_TERM_CGROUP: + return kctx->data->cgroup; case PBF_TERM_CODE_PAGE_SIZE: return kctx->data->code_page_size; case PBF_TERM_DATA_PAGE_SIZE: @@ -183,7 +186,6 @@ static inline __u64 perf_get_sample(struct bpf_perf_eve= nt_data_kern *kctx, case __PBF_UNUSED_TERM16: case __PBF_UNUSED_TERM18: case __PBF_UNUSED_TERM20: - case __PBF_UNUSED_TERM21: default: break; } diff --git a/tools/perf/util/bpf_skel/vmlinux/vmlinux.h b/tools/perf/util/b= pf_skel/vmlinux/vmlinux.h index 4fa21468487e..4dcad7b682bd 100644 --- a/tools/perf/util/bpf_skel/vmlinux/vmlinux.h +++ b/tools/perf/util/bpf_skel/vmlinux/vmlinux.h @@ -171,6 +171,7 @@ struct perf_sample_data { u32 cpu; } cpu_entry; u64 phys_addr; + u64 cgroup; u64 data_page_size; u64 code_page_size; } __attribute__((__aligned__(64))) __attribute__((preserve_access_index)); --=20 2.46.0.295.g3b9ea8a38a-goog From nobody Fri Dec 19 13:42:53 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BFB019D8A3; Mon, 26 Aug 2024 22:10:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724710249; cv=none; b=J5Xe/yKV4533rW/v0Z/MTkUsdbBlqNfFdRWM/gse+qscBgH7NyZ68612swxrDXxcLlT2GA8NaOXhST+TeYMn316RRWe7p6a4Z9qjIoWPeZ24t614a4os+bbLeGF8YkC6pEJvMKwVrh1FhDHhMyML8NLST+Uy0E4jsTQKK6nioVo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724710249; c=relaxed/simple; bh=rwfzMfzWfmYK+czXS5HQ2sT2TdEzkFp6mwDTDw/WD+U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k72Lca4vJi++3ZTmDX94aKZuUNA5uuHRgkw2tju94f448STYt36Z/TiYh0bgCPeo9yiqIA7w3wf4BoVxQl/ryKZYLwEVX1Ev3AyKOVDLN8DP64Ig2WnK+DDsb4vHdjM8hKqcye1ujq7zcrA3Xprd3yQVgqBCTCteY07H/EbrDXE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YBb8ilRM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YBb8ilRM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C6C53C8B7D9; Mon, 26 Aug 2024 22:10:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724710249; bh=rwfzMfzWfmYK+czXS5HQ2sT2TdEzkFp6mwDTDw/WD+U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YBb8ilRMeZUCvGKdipmXJtlNCM3JDj2kSsLP2YlUd+s8G+/LjZtWtkcVXL0I7qyfT h1h9IBjURXh0ebQwBLhNfoW2d/W0uNwMwsv1kXKU5nsN+R1TcU9B+PKxCmDsV6Zkt6 ykLEepcp3jXwda1vi9YupsmA91RjrFIlD5N5lADBaHyrejL6e+yC9qWA9q3sRAUXEp 4pTcYOyS1yYzJttiM2myXI6x6qgXp5nHbHcIRwakS/0IguUYEubi8C2mA3FrfeWBer sVK/22VQzEjQwmqJXjeDMoOEblhIhbeSsHyTxASi4M7EU4mdpfH2wfRsMwKaY9GPpx Vy9cIVR4pgo1Q== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian Subject: [PATCH 4/4] perf test: Add perf record cgroup filtering test Date: Mon, 26 Aug 2024 15:10:45 -0700 Message-ID: <20240826221045.1202305-5-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.295.g3b9ea8a38a-goog In-Reply-To: <20240826221045.1202305-1-namhyung@kernel.org> References: <20240826221045.1202305-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" $ sudo ./perf test filtering -vv 96: perf record sample filtering (by BPF) tests: --- start --- test child forked, pid 2966908 Checking BPF-filter privilege Basic bpf-filter test Basic bpf-filter test [Success] Failing bpf-filter test Failing bpf-filter test [Success] Group bpf-filter test Group bpf-filter test [Success] Multiple bpf-filter test Multiple bpf-filter test [Success] Cgroup bpf-filter test Cgroup bpf-filter test [Success] ---- end(0) ---- 96: perf record sample filtering (by BPF) tests : Ok Signed-off-by: Namhyung Kim --- tools/perf/tests/shell/record_bpf_filter.sh | 39 +++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/tools/perf/tests/shell/record_bpf_filter.sh b/tools/perf/tests= /shell/record_bpf_filter.sh index 4df33c15bfa7..1b58ccc1fd88 100755 --- a/tools/perf/tests/shell/record_bpf_filter.sh +++ b/tools/perf/tests/shell/record_bpf_filter.sh @@ -68,7 +68,7 @@ test_bpf_filter_fail() { =20 # 'cpu' requires PERF_SAMPLE_CPU flag if ! perf record -e task-clock --filter 'cpu > 0' \ - -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU + -o /dev/null true 2>&1 | grep -q PERF_SAMPLE_CPU then echo "Failing bpf-filter test [Failed forbidden CPU]" err=3D1 @@ -98,7 +98,7 @@ test_bpf_filter_group() { fi =20 if ! perf record -e task-clock --filter 'cpu > 0 || ip > 0' \ - -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU + -o /dev/null true 2>&1 | grep -q PERF_SAMPLE_CPU then echo "Group bpf-filter test [Failed forbidden CPU]" err=3D1 @@ -106,7 +106,7 @@ test_bpf_filter_group() { fi =20 if ! perf record -e task-clock --filter 'period > 0 || code_pgsz > 4096'= \ - -o /dev/null true 2>&1 | grep PERF_SAMPLE_CODE_PAGE_SIZE + -o /dev/null true 2>&1 | grep -q PERF_SAMPLE_CODE_PAGE_SIZE then echo "Group bpf-filter test [Failed forbidden CODE_PAGE_SIZE]" err=3D1 @@ -147,6 +147,35 @@ test_bpf_filter_multi() { echo "Multiple bpf-filter test [Success]" } =20 +test_bpf_filter_cgroup() { + echo "Cgroup bpf-filter test" + + if ! perf record -e task-clock --filter 'cgroup =3D=3D /' \ + -a --all-cgroups --synth=3Dcgroup -o "${perfdata}" true 2> /dev/null + then + echo "Cgroup bpf-filter test [Skipped cgroup not supported]" + return + fi + + # 'cgroup' requires PERF_SAMPLE_CGROUP flag + if ! perf record -e task-clock --filter 'cgroup =3D=3D /' \ + -o /dev/null true 2>&1 | grep -q PERF_SAMPLE_CGROUP + then + echo "Cgroup bpf-filter test [Failed CGROUP requires --all-cgroups]" + err=3D1 + return + fi + + if ! perf report -i "${perfdata}" -s cgroup -q | grep -q -F '100.00%' + then + echo "Cgroup bpf-filter test [Failed root cgroup does not have 100%]" + err=3D1 + return + fi + + echo "Cgroup bpf-filter test [Success]" +} + test_bpf_filter_priv =20 if [ $err =3D 0 ]; then @@ -165,5 +194,9 @@ if [ $err =3D 0 ]; then test_bpf_filter_multi fi =20 +if [ $err =3D 0 ]; then + test_bpf_filter_cgroup +fi + cleanup exit $err --=20 2.46.0.295.g3b9ea8a38a-goog