From nobody Mon Oct 6 04:57:10 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 042C31F0E26 for ; Thu, 24 Jul 2025 16:33:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374798; cv=none; b=L8ojHvihC60o/JFBPIsF6snbFs/VT3y1JWMmqtafjUhGTMBn08ASuZqyXagH91c7DFLqn7unu6F5hLEDYJREUnpupZAQun+LUOd1BsYQKXRfigaRvrQDfWv2w3bsT4X8Ql3IDeiIvTjOKwMLPr0gP6Mm4AMh0SC6Awz7Y+gzuOU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374798; c=relaxed/simple; bh=qdkXYwZwQilwi089YMqVjrMiZV659L43XoqfQaPVoIA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=neBwq1rjIdNO6+0JsrwswA2Hxbo0rGYb52A2i/bvnqXiUvOd3wONt39X4hh4AwaBr9dsZ1Rw21fU7iq5HEHC5OBKHh4m1ua6SuRpXvbUHjxsZu099ytccAESorKgbKXOUjtqJne/MvL7IK/oLcJjfn+gTNOUzLXkglNayZDMGr0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=zDNgcKbP; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="zDNgcKbP" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b31c38d4063so923471a12.3 for ; Thu, 24 Jul 2025 09:33:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374796; x=1753979596; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=tHMRbh0OGf1VtE1XWliHZ+PxZ7EmgPTkysBcMOF3iMA=; b=zDNgcKbPZ6lkhMBCyj6KteVitHhE6nbUIxfv5l+jFl4VZkxmYA3bGVl+4/YWpT9fuH vVT0bFDpxKK6RsG2GFiiA8+aKiesz90dh8qQVDE7MZWbuvNgSG6ICBPi3LllQHbWH7Nk jx1cb/eYkCUuaUy5XHw0WrvhWEdIxz50n9WiU/7t7MHFQdKJ08FRCBdurznz8PjCahEx i6Z8deoauGJI5DFh0kV0hFT39E4uRhJrvjuNVCnQ8eGWNEbGjBtn89Ta5vq1272EIqm6 TpsFzI+su97shaoOe+h3RnRelDL+ywIVKJUaMlWehg7mJjctELimnY/iDE6eyprpV8AV 8P0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374796; x=1753979596; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tHMRbh0OGf1VtE1XWliHZ+PxZ7EmgPTkysBcMOF3iMA=; b=fT0cSdXWX7Cm/ap6l6zeyr6K5IAKeyHCix8dmi2xGNybNG1s1WxyuMAibbPEF2zCS8 LoOgJi6hTkBaLoKMlSEybbtKsFq+JumH+/4cn5agI0kwW/wkmcwWGeNxngMhpvV3Y9pk BWyXbcjOlNBePw3R8M+6BPiglwLU9zytfHomZQQNBx9DlqwBFQR2eqWAtj8r2xZg5djW k0U4gmhHXI9wxG+FLgNbnSTzLh834OdelHhMFqSfoiNKQiY6rT1K1ccUHioxI9rwYVG1 u35cuT2hGd72y4AZdGmYjmZu/2BKQ+ERKbiMX0mtj28Pj7UF3yChTezgjKCAmYwWdUx5 tFFg== X-Forwarded-Encrypted: i=1; AJvYcCWntZXUUyIhgVKCQ2+R4FPpuCnfErUIEK9TqH3D0s5UAEbTvH/ijYOmSDmwFEZxu2Y1v+pLX2OEsLHnyqA=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5T/Nm98ag6aNi03JxDPoFuHr4Akm1nOF7M/DGcrChLnetYi// HQTxV/l/yJzqMlO0GsXvFRplzGblrgy1iqyqrzoScqqg9+ZVmoIMAKIUdpX3o0TwpfHc77dei1u MUMpGy9zr8g== X-Google-Smtp-Source: AGHT+IFUn9ibU7z3cYjN4eNtr5ZP5Zw75GPYkYhnnHDx8ub8GXqfpX9vK922RLak71vDGMJczBiyKtYkWmCZ X-Received: from plge7.prod.google.com ([2002:a17:902:cf47:b0:23d:eb0e:df66]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:c942:b0:234:a139:1215 with SMTP id d9443c01a7336-23f981d3e70mr105002605ad.35.1753374795910; Thu, 24 Jul 2025 09:33:15 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:41 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-2-irogers@google.com> Subject: [PATCH v6 01/22] perf build-id: Reduce size of "size" variable From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Later clean up of the dso_id to include a build_id will suffer from alignment and size issues. The size can only hold up to a value of BUILD_ID_SIZE (20) and the mmap2 event uses a byte for the value. Signed-off-by: Ian Rogers --- tools/perf/util/build-id.h | 2 +- tools/perf/util/synthetic-events.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h index a212497bfdb0..e3e0a446ff0c 100644 --- a/tools/perf/util/build-id.h +++ b/tools/perf/util/build-id.h @@ -13,7 +13,7 @@ =20 struct build_id { u8 data[BUILD_ID_SIZE]; - size_t size; + u8 size; }; =20 struct dso; diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 2fc4d0537840..68bb7c5fe1b1 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -2248,7 +2248,9 @@ int perf_event__synthesize_build_id(const struct perf= _tool *tool, =20 memset(&ev, 0, len); =20 - ev.build_id.size =3D min(bid->size, sizeof(ev.build_id.build_id)); + ev.build_id.size =3D bid->size; + if (ev.build_id.size > sizeof(ev.build_id.build_id)) + ev.build_id.size =3D sizeof(ev.build_id.build_id); memcpy(ev.build_id.build_id, bid->data, ev.build_id.size); ev.build_id.header.type =3D PERF_RECORD_HEADER_BUILD_ID; ev.build_id.header.misc =3D misc | PERF_RECORD_MISC_BUILD_ID_SIZE; @@ -2308,7 +2310,9 @@ int perf_event__synthesize_mmap2_build_id(const struc= t perf_tool *tool, ev.mmap2.len =3D len; ev.mmap2.pgoff =3D pgoff; =20 - ev.mmap2.build_id_size =3D min(bid->size, sizeof(ev.mmap2.build_id)); + ev.mmap2.build_id_size =3D bid->size; + if (ev.mmap2.build_id_size > sizeof(ev.mmap2.build_id)) + ev.build_id.size =3D sizeof(ev.mmap2.build_id); memcpy(ev.mmap2.build_id, bid->data, ev.mmap2.build_id_size); =20 ev.mmap2.prot =3D prot; --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 685052EA730 for ; Thu, 24 Jul 2025 16:33:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374800; cv=none; b=tS03jkGUPDHhhcfoxZF/l1W1CiTZF7NTUt8+j+cgILEHzweCql31ZWJBhCDf3P1O6oG4C4spisFrUbvH/k8XegCdLhcB641epY/8KX+afFEpq8eD9GhDqJmgdCCzL2ffDxsfz+TCGXGMz8/BR9guPBaa4mq/mv7M/7WnpYRo+Z0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374800; c=relaxed/simple; bh=6Kaw3YeDSjFMbgSGwOQqcOiX76bLmOxHdfk84Y2TCRw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=S6ibSuaSvp8iqn5fjD6+v6wfR8mNTTPd5bssSOSzomKn/08gWC3COn5JY3m7aESv5JddqaGvIfYrsHJLM2nd07xllLQHjsJYK+hZO6pJ+Bp6RKeH/zPW3jlePHxI9dHzRIQ8FNaD+7Qyu/5CJoVFZpsc2zB2OIi6yxDXCW1TkIk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=kiOz8ttW; arc=none smtp.client-ip=209.85.219.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="kiOz8ttW" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-e8420d8a209so1358764276.1 for ; Thu, 24 Jul 2025 09:33:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374798; x=1753979598; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=gpJDjPIAX11d0UZM38x2TXJLxVO8GJl81BGUasQciyA=; b=kiOz8ttW698LaJeJYL/n6KpOJ1WYvBu52tEDQ/bn9q3IxZF6IsjangfBsRDZ1reU7X Z8wicBwQB3e2XX10FtTyz+CD66m6cb+FzA76UqtRfHnRFnEUMP4rAO6sz2KC4/KJ/U+j nYdezqoMhMhXR0kd/7gqmtJ5K3orSonWcCm04/9+Fcd7AUCvVoV80mFatuPU01xgMJq2 +mD+uRpQsNf5RXbjHbDh22Kdy17PqK8YV2H/u4kbIFeAU5tvUJC4CIIotzwh7bChdPBy Y32Wh7aScskTjuggMSDoDd+XqFAh0L2oP9Ktd918wtV92pYZeBL6kMZeHMkK4Wr3v2N4 lcCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374798; x=1753979598; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=gpJDjPIAX11d0UZM38x2TXJLxVO8GJl81BGUasQciyA=; b=QO86MO+OdBJuw8D/NOugoLTitLjJrBxM+D0mxx+uGJ0DOPJRbPhMBCr8NrObx6z4WO iKc0vuPR5cpLRk7fLGH+MY8lwr4jkZdOvge4GE8W3pPsiuW7tl70UkTnhOt1kgeGZYsx +RzCG9ZUkbx8MAR4KfyGkG43LxryYNXSKPPSm8QnIdSHQJc2VP2ePp8Hn5bsdeOt0epD dw+BZrnRlS42nmRdZZoIbMxuRTPz5mjGz4HXQAef4xsksvAgUIF6iRlGtHIa1RII6OdF vSibkPvrF779LV0AB/nmMRoOYYXEALLuhmbQ36bRi8vHiB/axO+hQFBIue0UcLyY9qN/ KnKg== X-Forwarded-Encrypted: i=1; AJvYcCWLlPWx9oLoJ7INbCrKvI/NTtrmgXKVYCA9dSAiz+so9jqCIfqAoRGei71mExIJWFQS9lUy13w2En7zXYs=@vger.kernel.org X-Gm-Message-State: AOJu0YzmXZQxj4I/QOoABIj+pG7PGTCjYJyINb2SPjgQFIizhJZuzq7B kpxlB6x4TYXItTtDgZNI6oj5i9wyJrdiCSJY/3dzKArc3v6TfH+3WFzM5QrTNAxsPXZqUZUtOhK CrtHZde8ctQ== X-Google-Smtp-Source: AGHT+IH+Le6f7elHvBNL2n4qLT95uBiksK6rxQ1HIiL9ghL9ctylAbDJH7pUOUMT0lkqyTaWdv3fLin5G6C3 X-Received: from ybit77.prod.google.com ([2002:a25:aad3:0:b0:e8d:83a6:26e7]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6902:3292:b0:e8b:cf19:6675 with SMTP id 3f1490d57ef6-e8dc5a1089cmr7455723276.33.1753374798321; Thu, 24 Jul 2025 09:33:18 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:42 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-3-irogers@google.com> Subject: [PATCH v6 02/22] perf build-id: Truncate to avoid overflowing the build_id data From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Warning when the build_id data would be overflowed would lead to memory corruption, switch to truncation. Signed-off-by: Ian Rogers --- tools/perf/util/build-id.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index e763e8d99a43..5bc2040bdd0d 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -951,7 +951,10 @@ bool perf_session__read_build_ids(struct perf_session = *session, bool with_hits) =20 void build_id__init(struct build_id *bid, const u8 *data, size_t size) { - WARN_ON(size > BUILD_ID_SIZE); + if (size > BUILD_ID_SIZE) { + pr_debug("Truncating build_id size from %zd\n", size); + size =3D BUILD_ID_SIZE; + } memcpy(bid->data, data, size); bid->size =3D size; } --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8AFAD2EB5CA for ; Thu, 24 Jul 2025 16:33:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374803; cv=none; b=OsmX+uyqt1dTRYcEUIFU6kLjEZONyWsfbfnmivSr/JnheGXmYUE1qi/05G/oHAA+aUBnolknrBFaXTjDPJCkcp+TATplKPEOHW8KUiV/smKZpbny3Fh4CI635lz8RxZGlqB9Qp/WzQ6XFtVUhh3i3BzO6ugfnH+ysnkuoDKtG5E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374803; c=relaxed/simple; bh=MbrzOz6xbqjbPkpFZQpy97l7EOWbjfr7Msh9bjJm9Qo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=tJ2yXsugs3/ahsw5Yahq0YLTffQ7sCZ8E/uSyhtQwzgNZNreepVA4ZFjgVEy4HkpkKN2eRT/cH2O/wGNJENTVdNQb1DnGlujvs5Td9wh94fOAyTEm5tLd0NpxCh8T882L/vhJ6lnvE4dB2yDAZbNMzBTYlrJrRbJjJSrxyuoMtA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=cw2EYYCy; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="cw2EYYCy" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-235c897d378so12371255ad.1 for ; Thu, 24 Jul 2025 09:33:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374801; x=1753979601; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=XxhgzI8LQ0zBBYyfTFQz7gg0JtyeRMIE8m8cXglLpRE=; b=cw2EYYCy698mrohsD1siDEtdqCdfqcUcqGj5Y8BuNVdBY2/X62ClUY7N0nA6V36wi3 hAj/EprMAML0ywSc6ehu5kFWGUN6eEa31UI/3EpqwEwwjm6mwfJ3Bu/fhzGzEfJCbo+P 9FvSM65T7GNj1dkJaf9Auhjb9CTqDK8lrJUrMkshC0S7qr+kENxPAKuwG8nqiaqIoZLJ HxP+YiaioE6u+TyM15YwZ8PXbQR/+owQd5zy7Nf4ADmH02fWvllChgoeA1Wq/RgJwajd pX7QCQvC31n7+Y7TJhr/pc2WXSJQmu1VQxdh6LcN+dNIrku6dKUQGv5osjgcXFMnJblG em/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374801; x=1753979601; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XxhgzI8LQ0zBBYyfTFQz7gg0JtyeRMIE8m8cXglLpRE=; b=qhNwUHpmnjhuo1e9KNi0OG9Jpo60u8+038Xh82S/CATHRMBNToLICmlyD/AxOGg5Ws Ma35pHik+qzxb70SlUGdGEl2u7n6siRQXF9oRg+hk8r4kq+PX668Q7dwpBRs9Xo2uqV4 H92qiR8sdlDmnt+q9gWjdZCuL59AV05g6vPXcpK0eR82PTCgTh2upbl/zgeJOqVMzLPs znw/gR1/7a8Zu5YsphqX6HkhIGpSLC+scvYVujeYs4vCFpXia0oSdzYpVNxo5EXUbHaM slqWhV6G/BI46KHDHvXl4Y8bZyhhQFCJDPBlycaeyhdQLEfgmK3DlRRjF3yTvC9pJVjR CM2w== X-Forwarded-Encrypted: i=1; AJvYcCUI7igluRL4mMyAeGs8IL9SskhZuQG/RsmySbyvVGFfD/K/dgUKNVYGdpbln5n0aCNvAz+5CBey5pdGVTc=@vger.kernel.org X-Gm-Message-State: AOJu0YzNzO7GTZxVKakNhugN6J+yxQLBQ/f/w7NpEmH+48qBA64kQTPx l5oRjlRc0DnJSMIz1S7EvmlKhn/ybewWFyAPGzBZp6FVksYz2A/6pmfcE59An+5zYuB+655juGx fp6KdjxGXCQ== X-Google-Smtp-Source: AGHT+IF0fV+tmN7JmkOxVM7NZXgVUq+X8iGgjMZe2Kp+psizTG6m0IdLE1kOnZzJoeycdPO/cCTFuUclSmhu X-Received: from plgi7.prod.google.com ([2002:a17:902:cf07:b0:231:c831:9520]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:c949:b0:22e:421b:49b1 with SMTP id d9443c01a7336-23f98202832mr119778435ad.48.1753374800412; Thu, 24 Jul 2025 09:33:20 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:43 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-4-irogers@google.com> Subject: [PATCH v6 03/22] perf build-id: Change sprintf functions to snprintf From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Pass in a size argument rather than implying all build id strings must be SBUILD_ID_SIZE. Signed-off-by: Ian Rogers --- tools/perf/builtin-buildid-cache.c | 12 +++---- tools/perf/builtin-buildid-list.c | 6 ++-- tools/perf/util/build-id.c | 33 ++++++++----------- tools/perf/util/build-id.h | 6 ++-- tools/perf/util/disasm.c | 2 +- tools/perf/util/dso.c | 4 +-- tools/perf/util/dsos.c | 2 +- tools/perf/util/event.c | 2 +- tools/perf/util/header.c | 2 +- tools/perf/util/map.c | 2 +- tools/perf/util/probe-event.c | 2 +- tools/perf/util/probe-file.c | 4 +-- tools/perf/util/probe-finder.c | 2 +- .../scripting-engines/trace-event-python.c | 7 ++-- tools/perf/util/symbol.c | 2 +- 15 files changed, 40 insertions(+), 48 deletions(-) diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildi= d-cache.c index b0511d16aeb6..3f7739b21148 100644 --- a/tools/perf/builtin-buildid-cache.c +++ b/tools/perf/builtin-buildid-cache.c @@ -31,7 +31,7 @@ #include #include =20 -static int build_id_cache__kcore_buildid(const char *proc_dir, char *sbuil= did) +static int build_id_cache__kcore_buildid(const char *proc_dir, char *sbuil= did, size_t sbuildid_size) { char root_dir[PATH_MAX]; char *p; @@ -42,7 +42,7 @@ static int build_id_cache__kcore_buildid(const char *proc= _dir, char *sbuildid) if (!p) return -1; *p =3D '\0'; - return sysfs__sprintf_build_id(root_dir, sbuildid); + return sysfs__snprintf_build_id(root_dir, sbuildid, sbuildid_size); } =20 static int build_id_cache__kcore_dir(char *dir, size_t sz) @@ -128,7 +128,7 @@ static int build_id_cache__add_kcore(const char *filena= me, bool force) return -1; *p =3D '\0'; =20 - if (build_id_cache__kcore_buildid(from_dir, sbuildid) < 0) + if (build_id_cache__kcore_buildid(from_dir, sbuildid, sizeof(sbuildid)) <= 0) return -1; =20 scnprintf(to_dir, sizeof(to_dir), "%s/%s/%s", @@ -187,7 +187,7 @@ static int build_id_cache__add_file(const char *filenam= e, struct nsinfo *nsi) return -1; } =20 - build_id__sprintf(&bid, sbuild_id); + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); err =3D build_id_cache__add_s(sbuild_id, filename, nsi, false, false); pr_debug("Adding %s %s: %s\n", sbuild_id, filename, @@ -211,7 +211,7 @@ static int build_id_cache__remove_file(const char *file= name, struct nsinfo *nsi) return -1; } =20 - build_id__sprintf(&bid, sbuild_id); + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); err =3D build_id_cache__remove_s(sbuild_id); pr_debug("Removing %s %s: %s\n", sbuild_id, filename, err ? "FAIL" : "Ok"); @@ -317,7 +317,7 @@ static int build_id_cache__update_file(const char *file= name, struct nsinfo *nsi) } err =3D 0; =20 - build_id__sprintf(&bid, sbuild_id); + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); if (build_id_cache__cached(sbuild_id)) err =3D build_id_cache__remove_s(sbuild_id); =20 diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid= -list.c index 52dfacaff8e3..ba8ba0303920 100644 --- a/tools/perf/builtin-buildid-list.c +++ b/tools/perf/builtin-buildid-list.c @@ -31,7 +31,7 @@ static int buildid__map_cb(struct map *map, void *arg __m= aybe_unused) =20 memset(bid_buf, 0, sizeof(bid_buf)); if (dso__has_build_id(dso)) - build_id__sprintf(dso__bid_const(dso), bid_buf); + build_id__snprintf(dso__bid_const(dso), bid_buf, sizeof(bid_buf)); printf("%s %16" PRIx64 " %16" PRIx64, bid_buf, map__start(map), map__end(= map)); if (dso_long_name !=3D NULL) printf(" %s", dso_long_name); @@ -57,7 +57,7 @@ static int sysfs__fprintf_build_id(FILE *fp) char sbuild_id[SBUILD_ID_SIZE]; int ret; =20 - ret =3D sysfs__sprintf_build_id("/", sbuild_id); + ret =3D sysfs__snprintf_build_id("/", sbuild_id, sizeof(sbuild_id)); if (ret !=3D sizeof(sbuild_id)) return ret < 0 ? ret : -EINVAL; =20 @@ -69,7 +69,7 @@ static int filename__fprintf_build_id(const char *name, F= ILE *fp) char sbuild_id[SBUILD_ID_SIZE]; int ret; =20 - ret =3D filename__sprintf_build_id(name, sbuild_id); + ret =3D filename__snprintf_build_id(name, sbuild_id, sizeof(sbuild_id)); if (ret !=3D sizeof(sbuild_id)) return ret < 0 ? ret : -EINVAL; =20 diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index 5bc2040bdd0d..aa35dceace90 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -67,24 +67,17 @@ int build_id__mark_dso_hit(const struct perf_tool *tool= __maybe_unused, return 0; } =20 -int build_id__sprintf(const struct build_id *build_id, char *bf) +int build_id__snprintf(const struct build_id *build_id, char *bf, size_t b= f_size) { - char *bid =3D bf; - const u8 *raw =3D build_id->data; - size_t i; - - bf[0] =3D 0x0; + size_t offs =3D 0; =20 - for (i =3D 0; i < build_id->size; ++i) { - sprintf(bid, "%02x", *raw); - ++raw; - bid +=3D 2; - } + for (size_t i =3D 0; i < build_id->size && offs < bf_size; ++i) + offs +=3D snprintf(bf + offs, bf_size - offs, "%02x", build_id->data[i]); =20 - return (bid - bf) + 1; + return offs; } =20 -int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id) +int sysfs__snprintf_build_id(const char *root_dir, char *sbuild_id, size_t= sbuild_id_size) { char notes[PATH_MAX]; struct build_id bid; @@ -99,10 +92,10 @@ int sysfs__sprintf_build_id(const char *root_dir, char = *sbuild_id) if (ret < 0) return ret; =20 - return build_id__sprintf(&bid, sbuild_id); + return build_id__snprintf(&bid, sbuild_id, sbuild_id_size); } =20 -int filename__sprintf_build_id(const char *pathname, char *sbuild_id) +int filename__snprintf_build_id(const char *pathname, char *sbuild_id, siz= e_t sbuild_id_size) { struct build_id bid; int ret; @@ -111,7 +104,7 @@ int filename__sprintf_build_id(const char *pathname, ch= ar *sbuild_id) if (ret < 0) return ret; =20 - return build_id__sprintf(&bid, sbuild_id); + return build_id__snprintf(&bid, sbuild_id, sbuild_id_size); } =20 /* asnprintf consolidates asprintf and snprintf */ @@ -212,9 +205,9 @@ static bool build_id_cache__valid_id(char *sbuild_id) return false; =20 if (!strcmp(pathname, DSO__NAME_KALLSYMS)) - ret =3D sysfs__sprintf_build_id("/", real_sbuild_id); + ret =3D sysfs__snprintf_build_id("/", real_sbuild_id, sizeof(real_sbuild= _id)); else if (pathname[0] =3D=3D '/') - ret =3D filename__sprintf_build_id(pathname, real_sbuild_id); + ret =3D filename__snprintf_build_id(pathname, real_sbuild_id, sizeof(rea= l_sbuild_id)); else ret =3D -EINVAL; /* Should we support other special DSO cache? */ if (ret >=3D 0) @@ -243,7 +236,7 @@ char *__dso__build_id_filename(const struct dso *dso, c= har *bf, size_t size, if (!dso__has_build_id(dso)) return NULL; =20 - build_id__sprintf(dso__bid_const(dso), sbuild_id); + build_id__snprintf(dso__bid_const(dso), sbuild_id, sizeof(sbuild_id)); linkname =3D build_id_cache__linkname(sbuild_id, NULL, 0); if (!linkname) return NULL; @@ -769,7 +762,7 @@ static int build_id_cache__add_b(const struct build_id = *bid, { char sbuild_id[SBUILD_ID_SIZE]; =20 - build_id__sprintf(bid, sbuild_id); + build_id__snprintf(bid, sbuild_id, sizeof(sbuild_id)); =20 return __build_id_cache__add_s(sbuild_id, name, nsi, is_kallsyms, is_vdso, proper_name, root_dir); diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h index e3e0a446ff0c..47e621cebe1b 100644 --- a/tools/perf/util/build-id.h +++ b/tools/perf/util/build-id.h @@ -21,10 +21,10 @@ struct feat_fd; struct nsinfo; =20 void build_id__init(struct build_id *bid, const u8 *data, size_t size); -int build_id__sprintf(const struct build_id *build_id, char *bf); +int build_id__snprintf(const struct build_id *build_id, char *bf, size_t b= f_size); bool build_id__is_defined(const struct build_id *bid); -int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id); -int filename__sprintf_build_id(const char *pathname, char *sbuild_id); +int sysfs__snprintf_build_id(const char *root_dir, char *sbuild_id, size_t= sbuild_id_size); +int filename__snprintf_build_id(const char *pathname, char *sbuild_id, siz= e_t sbuild_id_size); char *build_id_cache__kallsyms_path(const char *sbuild_id, char *bf, size_t size); =20 diff --git a/tools/perf/util/disasm.c b/tools/perf/util/disasm.c index ff475a239f4b..b1e4919d016f 100644 --- a/tools/perf/util/disasm.c +++ b/tools/perf/util/disasm.c @@ -1218,7 +1218,7 @@ int symbol__strerror_disassemble(struct map_symbol *m= s, int errnum, char *buf, s char *build_id_msg =3D NULL; =20 if (dso__has_build_id(dso)) { - build_id__sprintf(dso__bid(dso), bf + 15); + build_id__snprintf(dso__bid(dso), bf + 15, sizeof(bf) - 15); build_id_msg =3D bf; } scnprintf(buf, buflen, diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index c6c1637e098c..4ff94029632e 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -217,7 +217,7 @@ int dso__read_binary_type_filename(const struct dso *ds= o, break; } =20 - build_id__sprintf(dso__bid_const(dso), build_id_hex); + build_id__snprintf(dso__bid_const(dso), build_id_hex, sizeof(build_id_he= x)); len =3D __symbol__join_symfs(filename, size, "/usr/lib/debug/.build-id/"= ); snprintf(filename + len, size - len, "%.2s/%s.debug", build_id_hex, build_id_hex + 2); @@ -1708,7 +1708,7 @@ static size_t dso__fprintf_buildid(struct dso *dso, F= ILE *fp) { char sbuild_id[SBUILD_ID_SIZE]; =20 - build_id__sprintf(dso__bid(dso), sbuild_id); + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); return fprintf(fp, "%s", sbuild_id); } =20 diff --git a/tools/perf/util/dsos.c b/tools/perf/util/dsos.c index 4d213017d202..47538273915d 100644 --- a/tools/perf/util/dsos.c +++ b/tools/perf/util/dsos.c @@ -373,7 +373,7 @@ static int dsos__fprintf_buildid_cb(struct dso *dso, vo= id *data) =20 if (args->skip && args->skip(dso, args->parm)) return 0; - build_id__sprintf(dso__bid(dso), sbuild_id); + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); args->ret +=3D fprintf(args->fp, "%-40s %s\n", sbuild_id, dso__long_name(= dso)); return 0; } diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 14b0d3689137..fcf44149feb2 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -334,7 +334,7 @@ size_t perf_event__fprintf_mmap2(union perf_event *even= t, FILE *fp) =20 build_id__init(&bid, event->mmap2.build_id, event->mmap2.build_id_size); - build_id__sprintf(&bid, sbuild_id); + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); =20 return fprintf(fp, " %d/%d: [%#" PRI_lx64 "(%#" PRI_lx64 ") @ %#" PRI_lx= 64 " <%s>]: %c%c%c%c %s\n", diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 53d54fbda10d..2aba0d829c9e 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -2303,7 +2303,7 @@ static int __event_process_build_id(struct perf_recor= d_header_build_id *bev, free(m.name); } =20 - build_id__sprintf(dso__bid(dso), sbuild_id); + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); pr_debug("build id event received for %s: %s [%zu]\n", dso__long_name(dso), sbuild_id, size); dso__put(dso); diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index d729438b7d65..0f6b185f9589 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -354,7 +354,7 @@ int map__load(struct map *map) if (dso__has_build_id(dso)) { char sbuild_id[SBUILD_ID_SIZE]; =20 - build_id__sprintf(dso__bid(dso), sbuild_id); + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); pr_debug("%s with build id %s not found", name, sbuild_id); } else pr_debug("Failed to open %s", name); diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 307ad6242a4e..cb777b878a48 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -1089,7 +1089,7 @@ static int __show_line_range(struct line_range *lr, c= onst char *module, } if (dinfo->build_id) { build_id__init(&bid, dinfo->build_id, BUILD_ID_SIZE); - build_id__sprintf(&bid, sbuild_id); + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); } debuginfo__delete(dinfo); if (ret =3D=3D 0 || ret =3D=3D -ENOENT) { diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c index ec8ac242fedb..5069fb61f48c 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -448,10 +448,10 @@ static int probe_cache__open(struct probe_cache *pcac= he, const char *target, if (!target || !strcmp(target, DSO__NAME_KALLSYMS)) { target =3D DSO__NAME_KALLSYMS; is_kallsyms =3D true; - ret =3D sysfs__sprintf_build_id("/", sbuildid); + ret =3D sysfs__snprintf_build_id("/", sbuildid, sizeof(sbuildid)); } else { nsinfo__mountns_enter(nsi, &nsc); - ret =3D filename__sprintf_build_id(target, sbuildid); + ret =3D filename__snprintf_build_id(target, sbuildid, sizeof(sbuildid)); nsinfo__mountns_exit(&nsc); } =20 diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 3cc7c40f5097..b74f6fe24bb6 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c @@ -859,7 +859,7 @@ static int find_probe_point_lazy(Dwarf_Die *sp_die, str= uct probe_finder *pf) comp_dir =3D cu_get_comp_dir(&pf->cu_die); if (pf->dbg->build_id) { build_id__init(&bid, pf->dbg->build_id, BUILD_ID_SIZE); - build_id__sprintf(&bid, sbuild_id); + build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); } ret =3D find_source_path(pf->fname, sbuild_id, comp_dir, &fpath); if (ret < 0) { diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools= /perf/util/scripting-engines/trace-event-python.c index 00f2c6c5114d..6655c0bbe0d8 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -780,14 +780,13 @@ static void set_sym_in_dict(PyObject *dict, struct ad= dr_location *al, const char *sym_field, const char *symoff_field, const char *map_pgoff) { - char sbuild_id[SBUILD_ID_SIZE]; - if (al->map) { + char sbuild_id[SBUILD_ID_SIZE]; struct dso *dso =3D map__dso(al->map); =20 pydict_set_item_string_decref(dict, dso_field, _PyUnicode_FromString(dso__name(dso))); - build_id__sprintf(dso__bid(dso), sbuild_id); + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); pydict_set_item_string_decref(dict, dso_bid_field, _PyUnicode_FromString(sbuild_id)); pydict_set_item_string_decref(dict, dso_map_start, @@ -1238,7 +1237,7 @@ static int python_export_dso(struct db_export *dbe, s= truct dso *dso, char sbuild_id[SBUILD_ID_SIZE]; PyObject *t; =20 - build_id__sprintf(dso__bid(dso), sbuild_id); + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); =20 t =3D tuple_new(5); =20 diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index ae0bd568ac45..573c65da9fe0 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -2152,7 +2152,7 @@ static char *dso__find_kallsyms(struct dso *dso, stru= ct map *map) goto proc_kallsyms; } =20 - build_id__sprintf(dso__bid(dso), sbuild_id); + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); =20 /* Find kallsyms in build-id cache with kcore */ scnprintf(path, sizeof(path), "%s/%s/%s", --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA9442EBBAC for ; Thu, 24 Jul 2025 16:33:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374808; cv=none; b=CHhaiCKgcdzbusErq3WJxx+VeZMQhxBdmY43F2+QqUtflVFa1l2KWf5VWrY1TcrRjJoxPewbSvNZUOizd94KDk3HzyM4AQ3X8TYvZif8V3Jc6leRXfk2m9n1+GbjRj/K7Nf3hGWvPREmn9ULKlA0/+e81ALV3XrDwSNIGU+a9/Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374808; c=relaxed/simple; bh=i87jvX210l24c7RqxS+bUYqmgL8+oZvqMbe8qDfav9Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=J4ivDgiWPcA5S3NRMeLxV9lZl1sS9w5ctmDit+KgCXV33bQu5ZLUolytP6U+zMGhfImX7/EEz+02VUh8t4p6KrBSaI1/ubtosgcQSHLGwGpbK2WlL9Bxo202Q40sOHOKjjQ1XXmu9Hy33sd8YgBWcwCd1c7Py3r9NN4L9q1HP14= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=XjM5KkS9; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="XjM5KkS9" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-756a4884dfcso1257230b3a.3 for ; Thu, 24 Jul 2025 09:33:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374806; x=1753979606; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=62dSX49aFLikEjIUMEVRlCmIJbHK4eeNScGSo/Mzprs=; b=XjM5KkS9vBcw5ali616l9FMbzTggDUX60SKh6sdl4g3HEcwSmVVeoY4mWb8AOBRITC r5HcghPWgfWOscXnZ4XeuSHSweuudWilg6KWATrilLU3IjPTtoJJY8pEJvpUwXRFQJpQ eHVv+4i+fMOUQucr+vNQy4TmCM6R/Oxx5GdMX8DjSoXQMjSsDL+mgCIIF0JJcvIOLOnD nW3CPHG+QTmYk5sw6ulwdDWx4Ak9nuTqyxPNBJWoc3r6jFudxyGTblqhIJsJbBXsALQT zzjeiQL57iIvZskL+MQAfv6T2LgaOWdvREw3SbtYaCfRJC/mjzLL9qsA0GoErxfBctzy ykVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374806; x=1753979606; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=62dSX49aFLikEjIUMEVRlCmIJbHK4eeNScGSo/Mzprs=; b=CSS/DnB+Sq1XJovLDQVhXF2jOfUoHfLQp6/evD8XQyCKQ+a/X1CukRbA+YlOeVAiFV QojhXPk4GCPT/k7pICCvwRI/h9PGycwnWdnU1dn24+8J4PotZkUzFVOvssPQLSWHBLA7 TXRvnAJcRrslyibCyY05tzP7H0J5iw0J/XIVe93pNn8rWAx1A1ReYjRkPpGtO4GcNKCo s556ZSD1YrtHOlHOS/tgHKhenKhyiUjAGa8CZ/AZahaEbWFtxdrgP5QqxYTpw6odYLr0 6GRzNq+7WD98Uop253EbcZaNoAY3pUDip3cE37o9JNI3n/+iBpuyBKecj601wiOgK6JR Ac3A== X-Forwarded-Encrypted: i=1; AJvYcCXhyFF9NwKRxttLIliR4ImYf+0xImyhhK6WkKDcxGvTCY2C1cEm7V5TqdXAWj2u4HLnNE0oCs5sixAWYzk=@vger.kernel.org X-Gm-Message-State: AOJu0YywR8KGd2SMdhJSYJNJ70ASRQgB1KzSBV4f5mojvKcQpAFIC2Qc rqHrfN1MEbe6RKxzqkTxghtiDZ0Wg9FTpZtn7yUUcYo/8dsWN9gNRr9clVsStnZxgpORYRy9PMf B1Jmd6+wtLw== X-Google-Smtp-Source: AGHT+IFZCjFgmdaI3NnelSKPac8n0knclpKXQWik2c3NFOqFyfb4a3FQ6KRAvAGmmyaW3sKiM5KoSl2FkuwJ X-Received: from pfvf6.prod.google.com ([2002:a05:6a00:1ac6:b0:747:a8e8:603e]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:d80f:b0:220:82c7:309c with SMTP id adf61e73a8af0-23d48fe74b2mr12168299637.7.1753374805136; Thu, 24 Jul 2025 09:33:25 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:44 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-5-irogers@google.com> Subject: [PATCH v6 04/22] perf build-id: Mark DSO in sample callchains From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Previously only the sample IP's map DSO would be marked hit for the purposes of populating the build ID cache. Walk the call chain to mark all IPs and DSOs. Signed-off-by: Ian Rogers --- tools/perf/util/build-id.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index aa35dceace90..3386fa8e1e7e 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -42,10 +42,20 @@ =20 static bool no_buildid_cache; =20 +static int mark_dso_hit_callback(struct callchain_cursor_node *node, void = *data __maybe_unused) +{ + struct map *map =3D node->ms.map; + + if (map) + dso__set_hit(map__dso(map)); + + return 0; +} + int build_id__mark_dso_hit(const struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, - struct evsel *evsel __maybe_unused, + struct evsel *evsel, struct machine *machine) { struct addr_location al; @@ -63,6 +73,11 @@ int build_id__mark_dso_hit(const struct perf_tool *tool = __maybe_unused, dso__set_hit(map__dso(al.map)); =20 addr_location__exit(&al); + + sample__for_each_callchain_node(thread, evsel, sample, PERF_MAX_STACK_DEP= TH, + /*symbols=3D*/false, mark_dso_hit_callback, /*data=3D*/NULL); + + thread__put(thread); return 0; } --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-ot1-f74.google.com (mail-ot1-f74.google.com [209.85.210.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 598A62EBDC7 for ; Thu, 24 Jul 2025 16:33:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374810; cv=none; b=R7hJypg8E4nWYz3rKfpC3OFJZpUnD6+KlO3Ugyc7rYz0SkX8z550mQYsyGJYXtufaGIPG2+85OgGcczVmAU5GY6aZ8wqUKd0dWeb/u/kHpJ6hdvPh80FhCMMG+ce3uU0yUwpwYwk8r3ZjjX0l0j41XGzSq5Bs+3BINM+T6/SOiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374810; c=relaxed/simple; bh=jWmhHDZHMj/3vn0T7Yg57/66qyMX0GILKf6742UzDIc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=eZqgUk+l50IHbDdITLKbgbJyfCzoLpbgV+DGL1gxTFabcrSwKvZL6GblmqaLdO00M6KvAkaO8AFyJFGJu5dWeZszTO3cYxcPdqinDgPheJ47tPt8CEuv+ts2XFAAifnQRI9XTo4cUA6tCbyGwnjq0E2r9aU37r1Y+Z0XcokzixE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fVilWEzi; arc=none smtp.client-ip=209.85.210.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fVilWEzi" Received: by mail-ot1-f74.google.com with SMTP id 46e09a7af769-73e542afa9dso1531006a34.1 for ; Thu, 24 Jul 2025 09:33:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374807; x=1753979607; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=k8rjfFzd/+TAfQBkNwQcdwCN90rmJcS2goaVAmuWKh4=; b=fVilWEzisKewcIKQ/VuE2GrYq9psuDo2oh9HyLZBQTd5LpWOPtth/D2aVt/+pO5Lil 4b7d2w4t2sawZ1rnqJSvEd7Fvt3vELwTdEbYz61DH/I6Pz7zIXcuGIeIsUtudHJfHJKr 6bblw3HAPLifH/rNQWOoAUerLV2L4LpdulUUoy4Cok1tjix7tddGtIvVIuDoWAAaxmmZ R6+RRKkFxt5iOqINr+rqK0rs7Mn/DeIUlPui+xS0ZftOiLPSqwP66yDpHotYEOIaHR1T JTRAJOm2Bgt5RWVTqncPXSKdjGfoyDFLYZUKJmruLI0pY2B2YM/lR2gc9rOsjS7AMkBk d49w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374807; x=1753979607; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=k8rjfFzd/+TAfQBkNwQcdwCN90rmJcS2goaVAmuWKh4=; b=CO0QGAHJIbofDUDCrj5ncVlIBsKEVFDBmAqUrE5gQFhUIAuf4DfjrPSv40INwm7+1o uHH14MXflS8ckZH2lrk0O7ii9I+bspE42Raq8JEK9dycmW87DPl8rW0zvDrWBToyyBkc +AdRS78xSACcAPBcwLf42835dqZPidCakYPlWjRr+i3IH0hmfyV5F9cfD9kPQemvP9xF kJSZBlp1YPkkrbM3tts/ryvIgFRgUIVslzbI6KTkjvMF/JKsa0SJvKIzBxB9gQpVXT7M hqURBCS0ZvQBDmBG0sP1V/D2HtGtUK8LupT8Tny7NIWb0yvlgLMXbEoP0e2GJl2UFStb Cwvg== X-Forwarded-Encrypted: i=1; AJvYcCXVONoP31AJJ4qpzRnI0UzMQsmCQASGNEOgtrR2wfR53BHlgI9qCacVM6S1hypKUY3MYiNZFeL9tVKmWS0=@vger.kernel.org X-Gm-Message-State: AOJu0YzbymLWtimXqw/AVKIGAcTzrdvYfzL2KGVKR6kbmLfPgqDNyFek k7nUUBiHyS8yxPbJwAdezLuPJMBAkWOSrTQVyhxEGI/TTJTDZQP+sw704Fe1bLRAvz8kF0Z8S+k wscSQS81n/Q== X-Google-Smtp-Source: AGHT+IGeB/DLDZyaNVsHJ4AdldqG7OAmJC6adn7cWB80Ve9eLfKQAPhnQItfzN+IISZ5vKzoha8DgZyIV7TB X-Received: from oabti11.prod.google.com ([2002:a05:6871:890b:b0:2c8:7806:5ad0]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6830:270e:b0:735:b9db:5939 with SMTP id 46e09a7af769-74088ab9e84mr6005118a34.10.1753374807417; Thu, 24 Jul 2025 09:33:27 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:45 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-6-irogers@google.com> Subject: [PATCH v6 05/22] perf build-id: Ensure struct build_id is empty before use From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If a build ID is read then not all code paths may ensure it is empty before use. Initialize the build_id to be zero-ed unless there is clear initialization such as a call to build_id__init. Signed-off-by: Ian Rogers --- tools/perf/bench/inject-buildid.c | 2 +- tools/perf/builtin-buildid-cache.c | 8 ++++---- tools/perf/tests/pe-file-parsing.c | 2 +- tools/perf/tests/sdt.c | 2 +- tools/perf/util/build-id.c | 6 +++--- tools/perf/util/debuginfo.c | 2 +- tools/perf/util/probe-event.c | 3 ++- tools/perf/util/probe-finder.c | 3 ++- tools/perf/util/symbol-minimal.c | 2 +- tools/perf/util/symbol.c | 5 +++-- tools/perf/util/synthetic-events.c | 2 +- 11 files changed, 20 insertions(+), 17 deletions(-) diff --git a/tools/perf/bench/inject-buildid.c b/tools/perf/bench/inject-bu= ildid.c index f55c07e4be94..aad572a78d7f 100644 --- a/tools/perf/bench/inject-buildid.c +++ b/tools/perf/bench/inject-buildid.c @@ -80,7 +80,7 @@ static int add_dso(const char *fpath, const struct stat *= sb __maybe_unused, int typeflag, struct FTW *ftwbuf __maybe_unused) { struct bench_dso *dso =3D &dsos[nr_dsos]; - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; =20 if (typeflag =3D=3D FTW_D || typeflag =3D=3D FTW_SL) return 0; diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildi= d-cache.c index 3f7739b21148..e936a34b7d37 100644 --- a/tools/perf/builtin-buildid-cache.c +++ b/tools/perf/builtin-buildid-cache.c @@ -175,7 +175,7 @@ static int build_id_cache__add_kcore(const char *filena= me, bool force) static int build_id_cache__add_file(const char *filename, struct nsinfo *n= si) { char sbuild_id[SBUILD_ID_SIZE]; - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; int err; struct nscookie nsc; =20 @@ -198,7 +198,7 @@ static int build_id_cache__add_file(const char *filenam= e, struct nsinfo *nsi) static int build_id_cache__remove_file(const char *filename, struct nsinfo= *nsi) { char sbuild_id[SBUILD_ID_SIZE]; - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; struct nscookie nsc; =20 int err; @@ -275,7 +275,7 @@ static int build_id_cache__purge_all(void) static bool dso__missing_buildid_cache(struct dso *dso, int parm __maybe_u= nused) { char filename[PATH_MAX]; - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; =20 if (!dso__build_id_filename(dso, filename, sizeof(filename), false)) return true; @@ -303,7 +303,7 @@ static int build_id_cache__fprintf_missing(struct perf_= session *session, FILE *f static int build_id_cache__update_file(const char *filename, struct nsinfo= *nsi) { char sbuild_id[SBUILD_ID_SIZE]; - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; struct nscookie nsc; =20 int err; diff --git a/tools/perf/tests/pe-file-parsing.c b/tools/perf/tests/pe-file-= parsing.c index fff58b220c07..30c7da79e109 100644 --- a/tools/perf/tests/pe-file-parsing.c +++ b/tools/perf/tests/pe-file-parsing.c @@ -24,7 +24,7 @@ static int run_dir(const char *d) { char filename[PATH_MAX]; char debugfile[PATH_MAX]; - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; char debuglink[PATH_MAX]; char expect_build_id[] =3D { 0x5a, 0x0f, 0xd8, 0x82, 0xb5, 0x30, 0x84, 0x22, diff --git a/tools/perf/tests/sdt.c b/tools/perf/tests/sdt.c index 919712899251..de4c7916b40d 100644 --- a/tools/perf/tests/sdt.c +++ b/tools/perf/tests/sdt.c @@ -28,7 +28,7 @@ static int target_function(void) static int build_id_cache__add_file(const char *filename) { char sbuild_id[SBUILD_ID_SIZE]; - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; int err; =20 err =3D filename__read_build_id(filename, &bid); diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index 3386fa8e1e7e..1abd5a670665 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -95,7 +95,7 @@ int build_id__snprintf(const struct build_id *build_id, c= har *bf, size_t bf_size int sysfs__snprintf_build_id(const char *root_dir, char *sbuild_id, size_t= sbuild_id_size) { char notes[PATH_MAX]; - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; int ret; =20 if (!root_dir) @@ -112,7 +112,7 @@ int sysfs__snprintf_build_id(const char *root_dir, char= *sbuild_id, size_t sbuil =20 int filename__snprintf_build_id(const char *pathname, char *sbuild_id, siz= e_t sbuild_id_size) { - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; int ret; =20 ret =3D filename__read_build_id(pathname, &bid); @@ -849,7 +849,7 @@ static int filename__read_build_id_ns(const char *filen= ame, =20 static bool dso__build_id_mismatch(struct dso *dso, const char *name) { - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; bool ret =3D false; =20 mutex_lock(dso__lock(dso)); diff --git a/tools/perf/util/debuginfo.c b/tools/perf/util/debuginfo.c index b5deea7cbdf2..a44c70f93156 100644 --- a/tools/perf/util/debuginfo.c +++ b/tools/perf/util/debuginfo.c @@ -103,7 +103,7 @@ struct debuginfo *debuginfo__new(const char *path) char buf[PATH_MAX], nil =3D '\0'; struct dso *dso; struct debuginfo *dinfo =3D NULL; - struct build_id bid; + struct build_id bid =3D { .size =3D 0}; =20 /* Try to open distro debuginfo files */ dso =3D dso__new(path); diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index cb777b878a48..e11c1be5c6d5 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -1063,7 +1063,6 @@ static int sprint_line_description(char *sbuf, size_t= size, struct line_range *l static int __show_line_range(struct line_range *lr, const char *module, bool user) { - struct build_id bid; int l =3D 1; struct int_node *ln; struct debuginfo *dinfo; @@ -1088,6 +1087,8 @@ static int __show_line_range(struct line_range *lr, c= onst char *module, ret =3D -ENOENT; } if (dinfo->build_id) { + struct build_id bid; + build_id__init(&bid, dinfo->build_id, BUILD_ID_SIZE); build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); } diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index b74f6fe24bb6..5ffd97ee4898 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c @@ -848,7 +848,6 @@ static int probe_point_lazy_walker(const char *fname, i= nt lineno, /* Find probe points from lazy pattern */ static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *p= f) { - struct build_id bid; char sbuild_id[SBUILD_ID_SIZE] =3D ""; int ret =3D 0; char *fpath; @@ -858,6 +857,8 @@ static int find_probe_point_lazy(Dwarf_Die *sp_die, str= uct probe_finder *pf) =20 comp_dir =3D cu_get_comp_dir(&pf->cu_die); if (pf->dbg->build_id) { + struct build_id bid; + build_id__init(&bid, pf->dbg->build_id, BUILD_ID_SIZE); build_id__snprintf(&bid, sbuild_id, sizeof(sbuild_id)); } diff --git a/tools/perf/util/symbol-minimal.c b/tools/perf/util/symbol-mini= mal.c index c73fe2e09fe9..7201494c5c20 100644 --- a/tools/perf/util/symbol-minimal.c +++ b/tools/perf/util/symbol-minimal.c @@ -317,7 +317,7 @@ int dso__load_sym(struct dso *dso, struct map *map __ma= ybe_unused, struct symsrc *runtime_ss __maybe_unused, int kmodule __maybe_unused) { - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; int ret; =20 ret =3D fd__is_64_bit(ss->fd); diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 573c65da9fe0..e816e4220d33 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1813,7 +1813,6 @@ int dso__load(struct dso *dso, struct map *map) struct symsrc *syms_ss =3D NULL, *runtime_ss =3D NULL; bool kmod; bool perfmap; - struct build_id bid; struct nscookie nsc; char newmapname[PATH_MAX]; const char *map_path =3D dso__long_name(dso); @@ -1874,6 +1873,8 @@ int dso__load(struct dso *dso, struct map *map) */ if (!dso__has_build_id(dso) && is_regular_file(dso__long_name(dso))) { + struct build_id bid =3D { .size =3D 0, }; + __symbol__join_symfs(name, PATH_MAX, dso__long_name(dso)); if (filename__read_build_id(name, &bid) > 0) dso__set_build_id(dso, &bid); @@ -2122,7 +2123,7 @@ static bool filename__readable(const char *file) =20 static char *dso__find_kallsyms(struct dso *dso, struct map *map) { - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; char sbuild_id[SBUILD_ID_SIZE]; bool is_host =3D false; char path[PATH_MAX]; diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 68bb7c5fe1b1..b7ebee95536f 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -368,7 +368,7 @@ static void perf_record_mmap2__read_build_id(struct per= f_record_mmap2 *event, struct machine *machine, bool is_kernel) { - struct build_id bid; + struct build_id bid =3D { .size =3D 0, }; struct nsinfo *nsi; struct nscookie nc; struct dso *dso =3D NULL; --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C7682ECD04 for ; Thu, 24 Jul 2025 16:33:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374812; cv=none; b=eVS8tGRN31+vUkpS4/UOsjGI+9tcOKA5+5p7k2EsMKn8+BCB8HepKD8Ilyc6EYMOGq/4+tEBd//u4P8Dlo5ZP93um4zTSVtGMxc7MtkJEgfir2Hy7fVki4PXkR1TVoAo/eCCb3u+Z2bWSGza5L85SBCeDP8BzmXAX5B4xZ6A/Ww= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374812; c=relaxed/simple; bh=NB1Ep094ITZzt/6hL2X0/hohe+yyinJWgy+rT7836GI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=nbUunrL7ln3GqoSDoHF2x97aN+ueBd/vRgpRmQ7paxEIaf4WMkUjb2Q7sMuMI1JnIUJ7QAzTAFnsxkplaJi8oaYhRKelpL3nzAkY0D1vi8Ric/kqWKZTfdz6GXSGP4LisVqzNihhjn44BlUe0q06atHc/5u2Ol5g5OO7yvJfddc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=0NQ8HI6v; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="0NQ8HI6v" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-235c897d378so12372405ad.1 for ; Thu, 24 Jul 2025 09:33:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374810; x=1753979610; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=WK9EPzbeJ+qRkJXWyqUsAEwwFgVrveIpmCMv0lOijV0=; b=0NQ8HI6vSEzGJ6ZzqVFjZuempPvEOfRsfph/Zvqs/T4NrpzwrUQRUP1HIzsM/CkqK0 3uu7IvxW1ng9iJA2LLR2PFJqq6KXYt3kBMulFYcV+R22FrzFfiIoJx8jbVRq8L6HaUIV jkHg4NGvxKYbIPKcT1A0a0Wwp8g9M4kCnBToYr5vf8OGGsovsIAMVJSWImDwY5RyXSKj gSL1JMYFHHv57wjKHo2B3w0mpX95M7XMh6mUKEqVxy/EjzaaPVkrn3M+cSdVggqWPbQT 5RjJYPVo1l7BUvVbje0ETb8RaNRdGpqQVcwIQoGy2t6bUsEf67/lqK8brViDG6CcWr4d e5vQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374810; x=1753979610; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=WK9EPzbeJ+qRkJXWyqUsAEwwFgVrveIpmCMv0lOijV0=; b=Cj/sEJG1QJ0EufuJTNLZO9CdXZUQULotCpPIWPvCFl18R2ctLadY9pilres7ARsA1U tpW0hzGARBZ4GOGKUGobPGdmUH4J1vVHryVKbRjNHf0cfhnnPPzPQ0CFxEX7pIsr2FBH hNRHMWsKIW6TuRj98ofxfO20HHet3MMtkrkFFuC6vsZkde1N0heFqDFWRmXELIopJkdv k70nC/DU+2QyyT5nxvYlJhdUz2qmau1Ckm1fD98JXVaJ8daS1jT/JfmvULFYf+3OxEfs quYceGVgZUmvsKiRqPmnZ0WS06sgsFFnmP3e6XTUkXnJpCsJbkuj1dSi43coW0cpOM9C gRPg== X-Forwarded-Encrypted: i=1; AJvYcCU/qyMiWvmUaVp8UjjGIVbHHTpxAn1l8nJrbPQgc74i3/SGmKXdauk9pj634Bv25b0+ITE7q8XOShvs/NU=@vger.kernel.org X-Gm-Message-State: AOJu0YwJcfTwOtwGPc1I5zlhylW4IkTH4XYvcQOnEbbF76/Nxr7U6EKc 86swqABKTwCJdg9PkwHln62ie5JtwN4jMVzAN0bp1pmEi6GTTMyrCE7pSY4RkwEvOk7u4BKAngk 31vrZY69Z+A== X-Google-Smtp-Source: AGHT+IFa1hINpUzyy4+2Wq3CNUWdFtyLTXMCev827tSWLYrHUUWQBWe8PbpTgJm2JcOJn8pzHz1WFqjN0ZKU X-Received: from plhw7.prod.google.com ([2002:a17:903:2f47:b0:234:1073:5b87]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:40d2:b0:234:d7c5:a0ea with SMTP id d9443c01a7336-23f981bb9abmr114443315ad.24.1753374809715; Thu, 24 Jul 2025 09:33:29 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:46 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-7-irogers@google.com> Subject: [PATCH v6 06/22] perf dso: Move build_id to dso_id From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The dso_id previously contained the major, minor, inode and inode generation information from a mmap2 event - the inode generation would be zero when reading from /proc/pid/maps. The build_id was in the dso. With build ID mmap2 events these fields wouldn't be initialized which would largely mean the special empty case where any dso would match for equality. This isn't desirable as if a dso is replaced we want the comparison to yield a difference. To support detecting the difference between DSOs based on build_id, move the build_id out of the DSO and into the dso_id. The dso_id is also stored in the DSO so nothing is lost. Capture in the dso_id what parts have been initialized and rename dso_id__inject to dso_id__improve_id so that it is clear the dso_id is being improved upon with additional information. With the build_id in the dso_id, use memcmp to compare for equality. Signed-off-by: Ian Rogers --- tools/perf/builtin-buildid-list.c | 2 +- tools/perf/builtin-inject.c | 36 ++++---- tools/perf/builtin-report.c | 11 ++- tools/perf/include/perf/perf_dlfilter.h | 2 +- tools/perf/tests/symbols.c | 4 +- tools/perf/util/build-id.c | 4 +- tools/perf/util/dso.c | 109 +++++++++++++----------- tools/perf/util/dso.h | 75 ++++++++-------- tools/perf/util/dsos.c | 18 ++-- tools/perf/util/machine.c | 28 +++--- tools/perf/util/map.c | 13 ++- tools/perf/util/map.h | 5 +- tools/perf/util/sort.c | 27 +++--- tools/perf/util/synthetic-events.c | 18 ++-- 14 files changed, 197 insertions(+), 155 deletions(-) diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid= -list.c index ba8ba0303920..151cd84b6dfe 100644 --- a/tools/perf/builtin-buildid-list.c +++ b/tools/perf/builtin-buildid-list.c @@ -31,7 +31,7 @@ static int buildid__map_cb(struct map *map, void *arg __m= aybe_unused) =20 memset(bid_buf, 0, sizeof(bid_buf)); if (dso__has_build_id(dso)) - build_id__snprintf(dso__bid_const(dso), bid_buf, sizeof(bid_buf)); + build_id__snprintf(dso__bid(dso), bid_buf, sizeof(bid_buf)); printf("%s %16" PRIx64 " %16" PRIx64, bid_buf, map__start(map), map__end(= map)); if (dso_long_name !=3D NULL) printf(" %s", dso_long_name); diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index b15eac0716f7..13bbb493141f 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -587,15 +587,17 @@ static int perf_event__repipe_mmap2(const struct perf= _tool *tool, struct perf_sample *sample, struct machine *machine) { - struct dso_id id; - struct dso_id *dso_id =3D NULL; + struct dso_id id =3D dso_id_empty; =20 - if (!(event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID)) { + if (event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID) { + build_id__init(&id.build_id, event->mmap2.build_id, event->mmap2.build_i= d_size); + } else { id.maj =3D event->mmap2.maj; id.min =3D event->mmap2.min; id.ino =3D event->mmap2.ino; id.ino_generation =3D event->mmap2.ino_generation; - dso_id =3D &id; + id.mmap2_valid =3D true; + id.mmap2_ino_generation_valid =3D true; } =20 return perf_event__repipe_common_mmap( @@ -603,7 +605,7 @@ static int perf_event__repipe_mmap2(const struct perf_t= ool *tool, event->mmap2.pid, event->mmap2.tid, event->mmap2.start, event->mmap2.len, event->mmap2.pgoff, event->mmap2.flags, event->mmap2.prot, - event->mmap2.filename, dso_id, + event->mmap2.filename, &id, perf_event__process_mmap2); } =20 @@ -671,19 +673,20 @@ static int perf_event__repipe_tracing_data(struct per= f_session *session, static int dso__read_build_id(struct dso *dso) { struct nscookie nsc; + struct build_id bid =3D { .size =3D 0, }; =20 if (dso__has_build_id(dso)) return 0; =20 mutex_lock(dso__lock(dso)); nsinfo__mountns_enter(dso__nsinfo(dso), &nsc); - if (filename__read_build_id(dso__long_name(dso), dso__bid(dso)) > 0) - dso__set_has_build_id(dso); + if (filename__read_build_id(dso__long_name(dso), &bid) > 0) + dso__set_build_id(dso, &bid); else if (dso__nsinfo(dso)) { char *new_name =3D dso__filename_with_chroot(dso, dso__long_name(dso)); =20 - if (new_name && filename__read_build_id(new_name, dso__bid(dso)) > 0) - dso__set_has_build_id(dso); + if (new_name && filename__read_build_id(new_name, &bid) > 0) + dso__set_build_id(dso, &bid); free(new_name); } nsinfo__mountns_exit(&nsc); @@ -732,23 +735,26 @@ static bool perf_inject__lookup_known_build_id(struct= perf_inject *inject, struct dso *dso) { struct str_node *pos; - int bid_len; =20 strlist__for_each_entry(pos, inject->known_build_ids) { + struct build_id bid; const char *build_id, *dso_name; + size_t bid_len; =20 build_id =3D skip_spaces(pos->s); dso_name =3D strchr(build_id, ' '); bid_len =3D dso_name - pos->s; + if (bid_len > sizeof(bid.data)) + bid_len =3D sizeof(bid.data); dso_name =3D skip_spaces(dso_name); if (strcmp(dso__long_name(dso), dso_name)) continue; - for (int ix =3D 0; 2 * ix + 1 < bid_len; ++ix) { - dso__bid(dso)->data[ix] =3D (hex(build_id[2 * ix]) << 4 | - hex(build_id[2 * ix + 1])); + for (size_t ix =3D 0; 2 * ix + 1 < bid_len; ++ix) { + bid.data[ix] =3D (hex(build_id[2 * ix]) << 4 | + hex(build_id[2 * ix + 1])); } - dso__bid(dso)->size =3D bid_len / 2; - dso__set_has_build_id(dso); + bid.size =3D bid_len / 2; + dso__set_build_id(dso, &bid); return true; } return false; diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index e662e1c3a7c6..26186717fe9b 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -861,17 +861,24 @@ static int maps__fprintf_task_cb(struct map *map, voi= d *data) struct maps__fprintf_task_args *args =3D data; const struct dso *dso =3D map__dso(map); u32 prot =3D map__prot(map); + const struct dso_id *dso_id =3D dso__id_const(dso); int ret; + char buf[SBUILD_ID_SIZE]; + + if (dso_id->mmap2_valid) + snprintf(buf, sizeof(buf), "%" PRIu64, dso_id->ino); + else + build_id__snprintf(&dso_id->build_id, buf, sizeof(buf)); =20 ret =3D fprintf(args->fp, - "%*s %" PRIx64 "-%" PRIx64 " %c%c%c%c %08" PRIx64 " %" PRIu64 " %s\n", + "%*s %" PRIx64 "-%" PRIx64 " %c%c%c%c %08" PRIx64 " %s %s\n", args->indent, "", map__start(map), map__end(map), prot & PROT_READ ? 'r' : '-', prot & PROT_WRITE ? 'w' : '-', prot & PROT_EXEC ? 'x' : '-', map__flags(map) ? 's' : 'p', map__pgoff(map), - dso__id_const(dso)->ino, dso__name(dso)); + buf, dso__name(dso)); =20 if (ret < 0) return ret; diff --git a/tools/perf/include/perf/perf_dlfilter.h b/tools/perf/include/p= erf/perf_dlfilter.h index 16fc4568ac53..2d3540ed3c58 100644 --- a/tools/perf/include/perf/perf_dlfilter.h +++ b/tools/perf/include/perf/perf_dlfilter.h @@ -87,7 +87,7 @@ struct perf_dlfilter_al { __u8 is_64_bit; /* Only valid if dso is not NULL */ __u8 is_kernel_ip; /* True if in kernel space */ __u32 buildid_size; - __u8 *buildid; + const __u8 *buildid; /* Below members are only populated by resolve_ip() */ __u8 filtered; /* True if this sample event will be filtered out */ const char *comm; diff --git a/tools/perf/tests/symbols.c b/tools/perf/tests/symbols.c index ee20a366f32f..b07fdf831868 100644 --- a/tools/perf/tests/symbols.c +++ b/tools/perf/tests/symbols.c @@ -96,8 +96,8 @@ static int create_map(struct test_info *ti, char *filenam= e, struct map **map_p) dso__put(dso); =20 /* Create a dummy map at 0x100000 */ - *map_p =3D map__new(ti->machine, 0x100000, 0xffffffff, 0, NULL, - PROT_EXEC, 0, NULL, filename, ti->thread); + *map_p =3D map__new(ti->machine, 0x100000, 0xffffffff, 0, &dso_id_empty, + PROT_EXEC, /*flags=3D*/0, filename, ti->thread); if (!*map_p) { pr_debug("Failed to create map!"); return TEST_FAIL; diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index 1abd5a670665..e2b295fe4d2f 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -251,7 +251,7 @@ char *__dso__build_id_filename(const struct dso *dso, c= har *bf, size_t size, if (!dso__has_build_id(dso)) return NULL; =20 - build_id__snprintf(dso__bid_const(dso), sbuild_id, sizeof(sbuild_id)); + build_id__snprintf(dso__bid(dso), sbuild_id, sizeof(sbuild_id)); linkname =3D build_id_cache__linkname(sbuild_id, NULL, 0); if (!linkname) return NULL; @@ -334,7 +334,7 @@ static int machine__write_buildid_table_cb(struct dso *= dso, void *data) } =20 in_kernel =3D dso__kernel(dso) || is_kernel_module(name, PERF_RECORD_MISC= _CPUMODE_UNKNOWN); - return write_buildid(name, name_len, dso__bid(dso), args->machine->pid, + return write_buildid(name, name_len, &dso__id(dso)->build_id, args->machi= ne->pid, in_kernel ? args->kmisc : args->umisc, args->fd); } =20 diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 4ff94029632e..282e3af85d5a 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -217,7 +217,7 @@ int dso__read_binary_type_filename(const struct dso *ds= o, break; } =20 - build_id__snprintf(dso__bid_const(dso), build_id_hex, sizeof(build_id_he= x)); + build_id__snprintf(dso__bid(dso), build_id_hex, sizeof(build_id_hex)); len =3D __symbol__join_symfs(filename, size, "/usr/lib/debug/.build-id/"= ); snprintf(filename + len, size - len, "%.2s/%s.debug", build_id_hex, build_id_hex + 2); @@ -1382,64 +1382,76 @@ static void dso__set_long_name_id(struct dso *dso, = const char *name, bool name_a =20 static int __dso_id__cmp(const struct dso_id *a, const struct dso_id *b) { - if (a->maj > b->maj) return -1; - if (a->maj < b->maj) return 1; + if (a->mmap2_valid && b->mmap2_valid) { + if (a->maj > b->maj) return -1; + if (a->maj < b->maj) return 1; =20 - if (a->min > b->min) return -1; - if (a->min < b->min) return 1; + if (a->min > b->min) return -1; + if (a->min < b->min) return 1; =20 - if (a->ino > b->ino) return -1; - if (a->ino < b->ino) return 1; - - /* - * Synthesized MMAP events have zero ino_generation, avoid comparing - * them with MMAP events with actual ino_generation. - * - * I found it harmful because the mismatch resulted in a new - * dso that did not have a build ID whereas the original dso did have a - * build ID. The build ID was essential because the object was not found - * otherwise. - Adrian - */ - if (a->ino_generation && b->ino_generation) { + if (a->ino > b->ino) return -1; + if (a->ino < b->ino) return 1; + } + if (a->mmap2_ino_generation_valid && b->mmap2_ino_generation_valid) { if (a->ino_generation > b->ino_generation) return -1; if (a->ino_generation < b->ino_generation) return 1; } - + if (build_id__is_defined(&a->build_id) && build_id__is_defined(&b->build_= id)) { + if (a->build_id.size !=3D b->build_id.size) + return a->build_id.size < b->build_id.size ? -1 : 1; + return memcmp(a->build_id.data, b->build_id.data, a->build_id.size); + } return 0; } =20 -bool dso_id__empty(const struct dso_id *id) -{ - if (!id) - return true; - - return !id->maj && !id->min && !id->ino && !id->ino_generation; -} +const struct dso_id dso_id_empty =3D { + { + .maj =3D 0, + .min =3D 0, + .ino =3D 0, + .ino_generation =3D 0, + }, + .mmap2_valid =3D false, + .mmap2_ino_generation_valid =3D false, + { + .size =3D 0, + } +}; =20 -void __dso__inject_id(struct dso *dso, const struct dso_id *id) +void __dso__improve_id(struct dso *dso, const struct dso_id *id) { struct dsos *dsos =3D dso__dsos(dso); struct dso_id *dso_id =3D dso__id(dso); + bool changed =3D false; =20 /* dsos write lock held by caller. */ =20 - dso_id->maj =3D id->maj; - dso_id->min =3D id->min; - dso_id->ino =3D id->ino; - dso_id->ino_generation =3D id->ino_generation; - - if (dsos) + if (id->mmap2_valid && !dso_id->mmap2_valid) { + dso_id->maj =3D id->maj; + dso_id->min =3D id->min; + dso_id->ino =3D id->ino; + dso_id->mmap2_valid =3D true; + changed =3D true; + } + if (id->mmap2_ino_generation_valid && !dso_id->mmap2_ino_generation_valid= ) { + dso_id->ino_generation =3D id->ino_generation; + dso_id->mmap2_ino_generation_valid =3D true; + changed =3D true; + } + if (build_id__is_defined(&id->build_id) && !build_id__is_defined(&dso_id-= >build_id)) { + dso_id->build_id =3D id->build_id; + changed =3D true; + } + if (changed && dsos) dsos->sorted =3D false; } =20 int dso_id__cmp(const struct dso_id *a, const struct dso_id *b) { - /* - * The second is always dso->id, so zeroes if not set, assume passing - * NULL for a means a zeroed id - */ - if (dso_id__empty(a) || dso_id__empty(b)) + if (a =3D=3D &dso_id_empty || b =3D=3D &dso_id_empty) { + /* There is no valid data to compare so the comparison always returns id= entical. */ return 0; + } =20 return __dso_id__cmp(a, b); } @@ -1540,7 +1552,6 @@ struct dso *dso__new_id(const char *name, const struc= t dso_id *id) dso->loaded =3D 0; dso->rel =3D 0; dso->sorted_by_name =3D 0; - dso->has_build_id =3D 0; dso->has_srcline =3D 1; dso->a2l_fails =3D 1; dso->kernel =3D DSO_SPACE__USER; @@ -1649,15 +1660,14 @@ int dso__swap_init(struct dso *dso, unsigned char e= idata) return 0; } =20 -void dso__set_build_id(struct dso *dso, struct build_id *bid) +void dso__set_build_id(struct dso *dso, const struct build_id *bid) { - RC_CHK_ACCESS(dso)->bid =3D *bid; - RC_CHK_ACCESS(dso)->has_build_id =3D 1; + dso__id(dso)->build_id =3D *bid; } =20 -bool dso__build_id_equal(const struct dso *dso, struct build_id *bid) +bool dso__build_id_equal(const struct dso *dso, const struct build_id *bid) { - const struct build_id *dso_bid =3D dso__bid_const(dso); + const struct build_id *dso_bid =3D dso__bid(dso); =20 if (dso_bid->size > bid->size && dso_bid->size =3D=3D BUILD_ID_SIZE) { /* @@ -1676,18 +1686,20 @@ bool dso__build_id_equal(const struct dso *dso, str= uct build_id *bid) void dso__read_running_kernel_build_id(struct dso *dso, struct machine *ma= chine) { char path[PATH_MAX]; + struct build_id bid =3D { .size =3D 0, }; =20 if (machine__is_default_guest(machine)) return; sprintf(path, "%s/sys/kernel/notes", machine->root_dir); - if (sysfs__read_build_id(path, dso__bid(dso)) =3D=3D 0) - dso__set_has_build_id(dso); + sysfs__read_build_id(path, &bid); + dso__set_build_id(dso, &bid); } =20 int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir) { char filename[PATH_MAX]; + struct build_id bid =3D { .size =3D 0, }; /* * kernel module short names are of the form "[module]" and * we need just "module" here. @@ -1698,9 +1710,8 @@ int dso__kernel_module_get_build_id(struct dso *dso, "%s/sys/module/%.*s/notes/.note.gnu.build-id", root_dir, (int)strlen(name) - 1, name); =20 - if (sysfs__read_build_id(filename, dso__bid(dso)) =3D=3D 0) - dso__set_has_build_id(dso); - + sysfs__read_build_id(filename, &bid); + dso__set_build_id(dso, &bid); return 0; } =20 diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index c87564471f9b..3457d713d3c5 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -185,14 +185,33 @@ enum dso_load_errno { #define DSO__DATA_CACHE_SIZE 4096 #define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1) =20 -/* - * Data about backing storage DSO, comes from PERF_RECORD_MMAP2 meta events +/** + * struct dso_id + * + * Data about backing storage DSO, comes from PERF_RECORD_MMAP2 meta event= s, + * reading from /proc/pid/maps or synthesis of build_ids from DSOs. Possib= ly + * incomplete at any particular use. */ struct dso_id { - u32 maj; - u32 min; - u64 ino; - u64 ino_generation; + /* Data related to the mmap2 event or read from /proc/pid/maps. */ + struct { + u32 maj; + u32 min; + u64 ino; + u64 ino_generation; + }; + /** @mmap2_valid: Are the maj, min and ino fields valid? */ + bool mmap2_valid; + /** + * @mmap2_ino_generation_valid: Is the ino_generation valid? Generally + * false for /proc/pid/maps mmap event. + */ + bool mmap2_ino_generation_valid; + /** + * @build_id: A possibly populated build_id. build_id__is_defined checks + * whether it is populated. + */ + struct build_id build_id; }; =20 struct dso_cache { @@ -243,7 +262,6 @@ DECLARE_RC_STRUCT(dso) { u64 addr; struct symbol *symbol; } last_find_result; - struct build_id bid; u64 text_offset; u64 text_end; const char *short_name; @@ -276,7 +294,6 @@ DECLARE_RC_STRUCT(dso) { enum dso_swap_type needs_swap:2; bool is_kmod:1; u8 adjust_symbols:1; - u8 has_build_id:1; u8 header_build_id:1; u8 has_srcline:1; u8 hit:1; @@ -292,6 +309,9 @@ DECLARE_RC_STRUCT(dso) { }; =20 extern struct mutex _dso__data_open_lock; +extern const struct dso_id dso_id_empty; + +int dso_id__cmp(const struct dso_id *a, const struct dso_id *b); =20 /* dso__for_each_symbol - iterate over the symbols of given type * @@ -362,31 +382,11 @@ static inline void dso__set_auxtrace_cache(struct dso= *dso, struct auxtrace_cach RC_CHK_ACCESS(dso)->auxtrace_cache =3D cache; } =20 -static inline struct build_id *dso__bid(struct dso *dso) -{ - return &RC_CHK_ACCESS(dso)->bid; -} - -static inline const struct build_id *dso__bid_const(const struct dso *dso) -{ - return &RC_CHK_ACCESS(dso)->bid; -} - static inline struct dso_bpf_prog *dso__bpf_prog(struct dso *dso) { return &RC_CHK_ACCESS(dso)->bpf_prog; } =20 -static inline bool dso__has_build_id(const struct dso *dso) -{ - return RC_CHK_ACCESS(dso)->has_build_id; -} - -static inline void dso__set_has_build_id(struct dso *dso) -{ - RC_CHK_ACCESS(dso)->has_build_id =3D true; -} - static inline bool dso__has_srcline(const struct dso *dso) { return RC_CHK_ACCESS(dso)->has_srcline; @@ -462,6 +462,16 @@ static inline const struct dso_id *dso__id_const(const= struct dso *dso) return &RC_CHK_ACCESS(dso)->id; } =20 +static inline const struct build_id *dso__bid(const struct dso *dso) +{ + return &dso__id_const(dso)->build_id; +} + +static inline bool dso__has_build_id(const struct dso *dso) +{ + return build_id__is_defined(dso__bid(dso)); +} + static inline struct rb_root_cached *dso__inlined_nodes(struct dso *dso) { return &RC_CHK_ACCESS(dso)->inlined_nodes; @@ -699,9 +709,6 @@ static inline void dso__set_text_offset(struct dso *dso= , u64 val) RC_CHK_ACCESS(dso)->text_offset =3D val; } =20 -int dso_id__cmp(const struct dso_id *a, const struct dso_id *b); -bool dso_id__empty(const struct dso_id *id); - struct dso *dso__new_id(const char *name, const struct dso_id *id); struct dso *dso__new(const char *name); void dso__delete(struct dso *dso); @@ -709,7 +716,7 @@ void dso__delete(struct dso *dso); int dso__cmp_id(struct dso *a, struct dso *b); void dso__set_short_name(struct dso *dso, const char *name, bool name_allo= cated); void dso__set_long_name(struct dso *dso, const char *name, bool name_alloc= ated); -void __dso__inject_id(struct dso *dso, const struct dso_id *id); +void __dso__improve_id(struct dso *dso, const struct dso_id *id); =20 int dso__name_len(const struct dso *dso); =20 @@ -739,8 +746,8 @@ void dso__sort_by_name(struct dso *dso); =20 int dso__swap_init(struct dso *dso, unsigned char eidata); =20 -void dso__set_build_id(struct dso *dso, struct build_id *bid); -bool dso__build_id_equal(const struct dso *dso, struct build_id *bid); +void dso__set_build_id(struct dso *dso, const struct build_id *bid); +bool dso__build_id_equal(const struct dso *dso, const struct build_id *bid= ); void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine); int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir); diff --git a/tools/perf/util/dsos.c b/tools/perf/util/dsos.c index 47538273915d..0a7645c7fae7 100644 --- a/tools/perf/util/dsos.c +++ b/tools/perf/util/dsos.c @@ -72,6 +72,7 @@ static int dsos__read_build_ids_cb(struct dso *dso, void = *data) { struct dsos__read_build_ids_cb_args *args =3D data; struct nscookie nsc; + struct build_id bid =3D { .size =3D 0, }; =20 if (args->with_hits && !dso__hit(dso) && !dso__is_vdso(dso)) return 0; @@ -80,15 +81,15 @@ static int dsos__read_build_ids_cb(struct dso *dso, voi= d *data) return 0; } nsinfo__mountns_enter(dso__nsinfo(dso), &nsc); - if (filename__read_build_id(dso__long_name(dso), dso__bid(dso)) > 0) { + if (filename__read_build_id(dso__long_name(dso), &bid) > 0) { + dso__set_build_id(dso, &bid); args->have_build_id =3D true; - dso__set_has_build_id(dso); } else if (errno =3D=3D ENOENT && dso__nsinfo(dso)) { char *new_name =3D dso__filename_with_chroot(dso, dso__long_name(dso)); =20 - if (new_name && filename__read_build_id(new_name, dso__bid(dso)) > 0) { + if (new_name && filename__read_build_id(new_name, &bid) > 0) { + dso__set_build_id(dso, &bid); args->have_build_id =3D true; - dso__set_has_build_id(dso); } free(new_name); } @@ -286,7 +287,7 @@ struct dso *dsos__find(struct dsos *dsos, const char *n= ame, bool cmp_short) struct dso *res; =20 down_read(&dsos->lock); - res =3D __dsos__find_id(dsos, name, NULL, cmp_short, /*write_locked=3D*/f= alse); + res =3D __dsos__find_id(dsos, name, &dso_id_empty, cmp_short, /*write_loc= ked=3D*/false); up_read(&dsos->lock); return res; } @@ -344,8 +345,8 @@ static struct dso *__dsos__findnew_id(struct dsos *dsos= , const char *name, const { struct dso *dso =3D __dsos__find_id(dsos, name, id, false, /*write_locked= =3D*/true); =20 - if (dso && dso_id__empty(dso__id(dso)) && !dso_id__empty(id)) - __dso__inject_id(dso, id); + if (dso) + __dso__improve_id(dso, id); =20 return dso ? dso : __dsos__addnew_id(dsos, name, id); } @@ -436,7 +437,8 @@ struct dso *dsos__findnew_module_dso(struct dsos *dsos, =20 down_write(&dsos->lock); =20 - dso =3D __dsos__find_id(dsos, m->name, NULL, /*cmp_short=3D*/true, /*writ= e_locked=3D*/true); + dso =3D __dsos__find_id(dsos, m->name, &dso_id_empty, /*cmp_short=3D*/tru= e, + /*write_locked=3D*/true); if (dso) { up_write(&dsos->lock); return dso; diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 7ec12c207970..2ef8c1cfae1e 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -1731,21 +1731,21 @@ int machine__process_mmap2_event(struct machine *ma= chine, { struct thread *thread; struct map *map; - struct dso_id dso_id =3D { - .maj =3D event->mmap2.maj, - .min =3D event->mmap2.min, - .ino =3D event->mmap2.ino, - .ino_generation =3D event->mmap2.ino_generation, - }; - struct build_id __bid, *bid =3D NULL; + struct dso_id dso_id =3D dso_id_empty; int ret =3D 0; =20 if (dump_trace) perf_event__fprintf_mmap2(event, stdout); =20 if (event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID) { - bid =3D &__bid; - build_id__init(bid, event->mmap2.build_id, event->mmap2.build_id_size); + build_id__init(&dso_id.build_id, event->mmap2.build_id, event->mmap2.bui= ld_id_size); + } else { + dso_id.maj =3D event->mmap2.maj; + dso_id.min =3D event->mmap2.min; + dso_id.ino =3D event->mmap2.ino; + dso_id.ino_generation =3D event->mmap2.ino_generation; + dso_id.mmap2_valid =3D true; + dso_id.mmap2_ino_generation_valid =3D true; } =20 if (sample->cpumode =3D=3D PERF_RECORD_MISC_GUEST_KERNEL || @@ -1757,7 +1757,7 @@ int machine__process_mmap2_event(struct machine *mach= ine, }; =20 strlcpy(xm.name, event->mmap2.filename, KMAP_NAME_LEN); - ret =3D machine__process_kernel_mmap_event(machine, &xm, bid); + ret =3D machine__process_kernel_mmap_event(machine, &xm, &dso_id.build_i= d); if (ret < 0) goto out_problem; return 0; @@ -1771,7 +1771,7 @@ int machine__process_mmap2_event(struct machine *mach= ine, map =3D map__new(machine, event->mmap2.start, event->mmap2.len, event->mmap2.pgoff, &dso_id, event->mmap2.prot, - event->mmap2.flags, bid, + event->mmap2.flags, event->mmap2.filename, thread); =20 if (map =3D=3D NULL) @@ -1829,8 +1829,8 @@ int machine__process_mmap_event(struct machine *machi= ne, union perf_event *event prot =3D PROT_EXEC; =20 map =3D map__new(machine, event->mmap.start, - event->mmap.len, event->mmap.pgoff, - NULL, prot, 0, NULL, event->mmap.filename, thread); + event->mmap.len, event->mmap.pgoff, + &dso_id_empty, prot, /*flags=3D*/0, event->mmap.filename, thread); =20 if (map =3D=3D NULL) goto out_problem_map; @@ -3192,7 +3192,7 @@ struct dso *machine__findnew_dso_id(struct machine *m= achine, const char *filenam =20 struct dso *machine__findnew_dso(struct machine *machine, const char *file= name) { - return machine__findnew_dso_id(machine, filename, NULL); + return machine__findnew_dso_id(machine, filename, &dso_id_empty); } =20 char *machine__resolve_kernel_addr(void *vmachine, unsigned long long *add= rp, char **modp) diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 0f6b185f9589..b46c68c24d1c 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -120,8 +120,8 @@ static void map__init(struct map *map, u64 start, u64 e= nd, u64 pgoff, } =20 struct map *map__new(struct machine *machine, u64 start, u64 len, - u64 pgoff, struct dso_id *id, - u32 prot, u32 flags, struct build_id *bid, + u64 pgoff, const struct dso_id *id, + u32 prot, u32 flags, char *filename, struct thread *thread) { struct map *result; @@ -132,7 +132,7 @@ struct map *map__new(struct machine *machine, u64 start= , u64 len, map =3D zalloc(sizeof(*map)); if (ADD_RC_CHK(result, map)) { char newfilename[PATH_MAX]; - struct dso *dso, *header_bid_dso; + struct dso *dso; int anon, no_dso, vdso, android; =20 android =3D is_android_lib(filename); @@ -189,16 +189,15 @@ struct map *map__new(struct machine *machine, u64 sta= rt, u64 len, dso__set_nsinfo(dso, nsi); mutex_unlock(dso__lock(dso)); =20 - if (build_id__is_defined(bid)) { - dso__set_build_id(dso, bid); - } else { + if (!build_id__is_defined(&id->build_id)) { /* * If the mmap event had no build ID, search for an existing dso from t= he * build ID header by name. Otherwise only the dso loaded at the time of * reading the header will have the build ID set and all future mmaps w= ill * have it missing. */ - header_bid_dso =3D dsos__find(&machine->dsos, filename, false); + struct dso *header_bid_dso =3D dsos__find(&machine->dsos, filename, fal= se); + if (header_bid_dso && dso__header_build_id(header_bid_dso)) { dso__set_build_id(dso, dso__bid(header_bid_dso)); dso__set_header_build_id(dso, 1); diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h index 4262f5a143be..9cadf533a561 100644 --- a/tools/perf/util/map.h +++ b/tools/perf/util/map.h @@ -173,11 +173,10 @@ struct thread; __map__for_each_symbol_by_name(map, sym_name, (pos), idx) =20 struct dso_id; -struct build_id; =20 struct map *map__new(struct machine *machine, u64 start, u64 len, - u64 pgoff, struct dso_id *id, u32 prot, u32 flags, - struct build_id *bid, char *filename, struct thread *thread); + u64 pgoff, const struct dso_id *id, u32 prot, u32 flags, + char *filename, struct thread *thread); struct map *map__new2(u64 start, struct dso *dso); void map__delete(struct map *map); struct map *map__clone(struct map *map); diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 45e654653960..7969d64a47bf 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -1746,22 +1746,27 @@ sort__dcacheline_cmp(struct hist_entry *left, struc= t hist_entry *right) if (rc) return rc; /* - * Addresses with no major/minor numbers are assumed to be + * Addresses with no major/minor numbers or build ID are assumed to be * anonymous in userspace. Sort those on pid then address. * * The kernel and non-zero major/minor mapped areas are * assumed to be unity mapped. Sort those on address. */ + if (left->cpumode !=3D PERF_RECORD_MISC_KERNEL && (map__flags(l_map) & MA= P_SHARED) =3D=3D 0) { + const struct dso_id *dso_id =3D dso__id_const(l_dso); =20 - if ((left->cpumode !=3D PERF_RECORD_MISC_KERNEL) && - (!(map__flags(l_map) & MAP_SHARED)) && !dso__id(l_dso)->maj && !dso__= id(l_dso)->min && - !dso__id(l_dso)->ino && !dso__id(l_dso)->ino_generation) { - /* userspace anonymous */ + if (!dso_id->mmap2_valid) + dso_id =3D dso__id_const(r_dso); =20 - if (thread__pid(left->thread) > thread__pid(right->thread)) - return -1; - if (thread__pid(left->thread) < thread__pid(right->thread)) - return 1; + if (!build_id__is_defined(&dso_id->build_id) && + (!dso_id->mmap2_valid || (dso_id->maj =3D=3D 0 && dso_id->min =3D=3D= 0))) { + /* userspace anonymous */ + + if (thread__pid(left->thread) > thread__pid(right->thread)) + return -1; + if (thread__pid(left->thread) < thread__pid(right->thread)) + return 1; + } } =20 addr: @@ -1786,6 +1791,7 @@ static int hist_entry__dcacheline_snprintf(struct his= t_entry *he, char *bf, if (he->mem_info) { struct map *map =3D mem_info__daddr(he->mem_info)->ms.map; struct dso *dso =3D map ? map__dso(map) : NULL; + const struct dso_id *dso_id =3D dso ? dso__id_const(dso) : &dso_id_empty; =20 addr =3D cl_address(mem_info__daddr(he->mem_info)->al_addr, chk_double_c= l); ms =3D &mem_info__daddr(he->mem_info)->ms; @@ -1794,8 +1800,7 @@ static int hist_entry__dcacheline_snprintf(struct his= t_entry *he, char *bf, if ((he->cpumode !=3D PERF_RECORD_MISC_KERNEL) && map && !(map__prot(map) & PROT_EXEC) && (map__flags(map) & MAP_SHARED) && - (dso__id(dso)->maj || dso__id(dso)->min || dso__id(dso)->ino || - dso__id(dso)->ino_generation)) + (!dso_id->mmap2_valid || (dso_id->maj =3D=3D 0 && dso_id->min =3D= =3D 0))) level =3D 's'; else if (!map) level =3D 'X'; diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index b7ebee95536f..69b98023ce74 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -372,7 +372,7 @@ static void perf_record_mmap2__read_build_id(struct per= f_record_mmap2 *event, struct nsinfo *nsi; struct nscookie nc; struct dso *dso =3D NULL; - struct dso_id id; + struct dso_id dso_id =3D dso_id_empty; int rc; =20 if (is_kernel) { @@ -380,12 +380,18 @@ static void perf_record_mmap2__read_build_id(struct p= erf_record_mmap2 *event, goto out; } =20 - id.maj =3D event->maj; - id.min =3D event->min; - id.ino =3D event->ino; - id.ino_generation =3D event->ino_generation; + if (event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID) { + build_id__init(&dso_id.build_id, event->build_id, event->build_id_size); + } else { + dso_id.maj =3D event->maj; + dso_id.min =3D event->min; + dso_id.ino =3D event->ino; + dso_id.ino_generation =3D event->ino_generation; + dso_id.mmap2_valid =3D true; + dso_id.mmap2_ino_generation_valid =3D true; + }; =20 - dso =3D dsos__findnew_id(&machine->dsos, event->filename, &id); + dso =3D dsos__findnew_id(&machine->dsos, event->filename, &dso_id); if (dso && dso__has_build_id(dso)) { bid =3D *dso__bid(dso); rc =3D 0; --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 01EC02ECD3D for ; Thu, 24 Jul 2025 16:33:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374815; cv=none; b=ufUpTc6bnDK7cEdo756RSQ0YDuTLAGDDtD+dIP+vUJMporGuAcBU6pUi1T3X6bNe2Wv5pNrcTNJ+j7Bdn3779tDcl91JwmIn4OSiZhhBXLKTkaLk4QvQ1t7zJH+to7tTBAUJwLTfyCcprnG0qcDRvi1uER0l8zmbNvX+4WO6pyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374815; c=relaxed/simple; bh=P8WhQ3O+yjKiV4VpOj5b0RW/o37hKGc8Nx443C7ljNA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=eX97nLLjKNjMt2Xm42N6jF8wJtKLDGMhN4mTpw9OsGz3wigyJFJCtgA0XqbLh7x+ObXD4qpBaC4ozBao8KbAV8S0oOOPAahiR9vnsQew24OCNw4hhSVmoJ4+nS374hogHgikPIh+prIo+guPWy3OCUGWn8nS7O2nL01w9V6pS6s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=gdvw0fi9; arc=none smtp.client-ip=209.85.219.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="gdvw0fi9" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-e8db89e6a79so1374265276.3 for ; Thu, 24 Jul 2025 09:33:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374813; x=1753979613; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=9qZk4Btue5jwbOWFWxrzEldf12I1UnrvpVVyWUncOwg=; b=gdvw0fi9PlTA9PRT+DTKjyr24jasR0/rExH2FVTt4sdO6jBTwWrrInoEMTuuAj7F+y RaVNF0KcGCbXHEct/iBJR6rbAMwHnLHt7pv9unnm34ag50eNfowyXY1mMzEnaSFNjHJN PFfYsxhgop+LY4MXWplpxEzlX0j5JHk1Qjcqk3AyCCcrd37N7ZZFGXZCd7kveRvU1aRa g1jXeQJgY06uuw3sYYT+PGHkIO988YAtmU/p+olFiknw5ZJLzBK8BL0zRPZjZmtGz/er 4zYFIrHQ2/FpS1gFYe0BusphD6mlqx3AXMsqLBzR6Uael9f6+viCRxeKzwjXxPSogbZF Dijw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374813; x=1753979613; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=9qZk4Btue5jwbOWFWxrzEldf12I1UnrvpVVyWUncOwg=; b=Ci7HNVc+FQlq08VWO/DES680gQMcp3HiG+b9yGMqtRmAlkxccbDXexiTXSCk2GQ7SY 0FVd68YcZNWyhpD6a23RGYzl8nazhr+LXFb0sUAi+Ypj4HaVA1IBVu9DesPLTrB7OhR/ XJnUolSv5KbfGASEqQzZgCMgVLh7oyvPg+UCbC6BDo1526ZQu1n5peBxqp987+yH5To3 1gBjXTUrIMRcOVS2GMNyXLzsEL7PwN9TKjBf03A4696mOAxZaiyCH/u1qw/k8DLU/Akx G7UlBkfZtsJMZIMrrO0NOInLgHQ3rDwo5beTJfsL04wVteMaNT9jEuNoO4CqSZKRnMCa 9SFQ== X-Forwarded-Encrypted: i=1; AJvYcCXJIRehTdfJ51QuCq9h3fkz2p6g33Y4Lx4ldEh7g2Q1eGNK+NnuBtrFoK1TZknqJBT+qYGIjyIL1Y4Tw/w=@vger.kernel.org X-Gm-Message-State: AOJu0YwDyDt12bW9pqzC4lcqPAcaYZUwIH0JqHxrKd6R6n2si8l3h7S/ SREXhx+33S+SwP48iKK//QUgp2fYdfguZ65Is4RBdFiOFTaJh+L68vpNqFU+qzTypX98qlz98K1 CTn/cTwb0oA== X-Google-Smtp-Source: AGHT+IEOt27lqK3sp4i1efGbvgf9wXr51wugMgagIhfqxoYnxdWIBiRk+bLSIT092Fv9Vx+LotI4jjMMtsKp X-Received: from ybo28.prod.google.com ([2002:a05:6902:541c:b0:e8d:debf:6293]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a25:bf85:0:b0:e8d:8e06:b567 with SMTP id 3f1490d57ef6-e8dc5ab82eemr6898300276.40.1753374813007; Thu, 24 Jul 2025 09:33:33 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:47 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-8-irogers@google.com> Subject: [PATCH v6 07/22] perf jitdump: Directly mark the jitdump DSO From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The DSO being generated was being accessed through a thread's maps, this is unnecessary as the dso can just be directly found. This avoids problems with passing a NULL evsel which may be inspected to determine properties of a callchain when using the buildid DSO marking code. Signed-off-by: Ian Rogers --- tools/perf/util/jitdump.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tools/perf/util/jitdump.c b/tools/perf/util/jitdump.c index 624964f01b5f..b062b1f234b6 100644 --- a/tools/perf/util/jitdump.c +++ b/tools/perf/util/jitdump.c @@ -14,9 +14,9 @@ #include #include =20 -#include "build-id.h" #include "event.h" #include "debug.h" +#include "dso.h" #include "evlist.h" #include "namespaces.h" #include "symbol.h" @@ -531,9 +531,22 @@ static int jit_repipe_code_load(struct jit_buf_desc *j= d, union jr_entry *jr) /* * mark dso as use to generate buildid in the header */ - if (!ret) - build_id__mark_dso_hit(tool, event, &sample, NULL, jd->machine); - + if (!ret) { + struct dso_id dso_id =3D { + { + .maj =3D event->mmap2.maj, + .min =3D event->mmap2.min, + .ino =3D event->mmap2.ino, + .ino_generation =3D event->mmap2.ino_generation, + }, + .mmap2_valid =3D true, + .mmap2_ino_generation_valid =3D true, + }; + struct dso *dso =3D machine__findnew_dso_id(jd->machine, filename, &dso_= id); + + if (dso) + dso__set_hit(dso); + } out: perf_sample__exit(&sample); free(event); --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 814FA2ECE98 for ; Thu, 24 Jul 2025 16:33:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374818; cv=none; b=h01fIHytXSDmKiu+DYHnvX6WNQN9d3Zi09DgT20CZMZcaoNH68FeQ8rpC9B1SC60JpRjquL7DWN0CpTb2ZzZNv4e/tIM8OCFpFHTuHPF8ZOF6yeR4a7Fk0K4F8DohMk7+yVj4uU7+OMI+GTkU47SkTtFYcyB//hMAx95+dBAVtg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374818; c=relaxed/simple; bh=z/xSjHdP56FXYIWs+aIIljgC0ViewnharrTuckvuFUU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=R2dRlP18aU/0T6+TkCciqAyoS/g9QeFTr95uY5aTmKRzsgmpdyVf0Ok/bpT64l1TQ3Y6g4eYxElX7D8dfIbdmW5S8yet1tJlwsjfj+MfZoIjHh9gDiAXtnBOYTIMF2khHzjmE1qflwCr+pnNDcIQy4m5zUFJbNn/dwI8HviISyg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=M9nAMuRn; arc=none smtp.client-ip=209.85.219.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="M9nAMuRn" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-e72b0980138so1760492276.1 for ; Thu, 24 Jul 2025 09:33:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374815; x=1753979615; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=Sdm1hmB2kPMSJ2yB+sDP6pEGWfyWwz9T2RmJ3aOqJf4=; b=M9nAMuRnCoJKE+wQWjGp2naLe/993Zlb0/vdxgKJff8DDjd9gtVEUDbZQBG3ZV5g9p ndLuebIk6cHDjyG0gxVszcv/tpnxybjdZ5QInVd2/5POj65YXjHpCoWbq3zpvXYuj2GR 6gD3OMsMWS3eA7u88Czm8SqR8pFajy5fAeJl88yokZT5nDyI2ZJUiC5vNWvwv/xVg4YI dfJFICrtAKicN6tGBDNp+RA10YRAwAnb6NeFJlAlhy7zYyeeFLX73CXbz22wt//ETX/8 F9TAzVQakkMf8La7qitFm2xUuTWudBiNKi4FpaCrS2JQOtJxpr337NRWqDgvgcFwdHlj 3Rxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374815; x=1753979615; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Sdm1hmB2kPMSJ2yB+sDP6pEGWfyWwz9T2RmJ3aOqJf4=; b=WY/ni0wYNds6AYNARCaNnQYpihBpbtkotX4HgwdEOqawOApciEZsLKTXkdbQ2MxAG5 mI04neVViUjQLWzqGHkZFQ+7jFGz6i7MXUsDklzQDP2Lfca2TCyCn9P3YDy027GhOytC aDND+KxmVhA7tlOiJ8iEttLv+H7tu7JGSFwvGta0bM297aKqQSadjfa73alh7qPEkPO6 032u9m+n7bwTknp2UpkiK+xhhXIVLmN1KOiia/bcIpzrMOHv33Sh1SK3KIRIfnTlkhpp gTpfl/wTINhkB7VFo7Y2aHmWXsbEUtzEPMxkQRoKRFPfQdyzLg7e2KNm2Yh0KJKlnhyH OJbQ== X-Forwarded-Encrypted: i=1; AJvYcCV6kx+6sJjiD6ptQIBR/HWmK7dbqoFd3pKo4kXrbNIJdRkfKZpT9BzUCTqc+hFvy2hxbzbZcBDxm18+tCg=@vger.kernel.org X-Gm-Message-State: AOJu0Ywx7nMzh86Ox915brUdfHzql4zBylLFexCqRYWXokdvCtjKSSe5 vzU/DhJNUvHcm+07pvV6EFiDrwmo3/wF1Ho5ZoWjyKKQrT7VOUq88xc0ZRVUe32TPwMg48Gy4Mz b4DObtL03yQ== X-Google-Smtp-Source: AGHT+IGdvVU2kyOvJVHKnWQwtopdS3uO12p5q6cuQuTQqBzAPtRCgVQ93vv29c0Qy5A/Q0xotZJoWnAwhvCZ X-Received: from ybaa8.prod.google.com ([2002:a05:6902:4808:b0:e8d:dc80:4fb2]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a25:1c6:0:b0:e8d:892c:a2e4 with SMTP id 3f1490d57ef6-e8dc5ac9b46mr7678442276.28.1753374815175; Thu, 24 Jul 2025 09:33:35 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:48 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-9-irogers@google.com> Subject: [PATCH v6 08/22] perf record: Make --buildid-mmap the default From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Support for build IDs in mmap2 perf events has been present since Linux v5.12: https://lore.kernel.org/lkml/20210219194619.1780437-1-acme@kernel.org/ Build ID mmap events don't avoid the need to inject build IDs for DSO touched by samples as the build ID cache is populated by perf record. They can avoid some cases of symbol mis-resolution caused by the file system changing from when a sample occurred and when the DSO is sought. Unlike the --buildid-mmap option, this chnage doesn't disable the build ID cache but it does disable the processing of samples looking for DSOs to inject build IDs for. To disable the build ID cache the -B (--no-buildid) option should be used. Making this option the default was raised on the list in: https://lore.kernel.org/linux-perf-users/CAP-5=3DfXP7jN_QrGUcd55_QH5J-Y-FCa= J6=3DNaHVtyx0oyNh8_-Q@mail.gmail.com/ Signed-off-by: Ian Rogers --- tools/perf/Documentation/perf-record.txt | 4 ++- tools/perf/builtin-record.c | 34 +++++++++++++++--------- tools/perf/util/symbol_conf.h | 2 +- tools/perf/util/synthetic-events.c | 16 +++++------ 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Document= ation/perf-record.txt index 612612fa2d80..067891bd7da6 100644 --- a/tools/perf/Documentation/perf-record.txt +++ b/tools/perf/Documentation/perf-record.txt @@ -563,7 +563,9 @@ Specify vmlinux path which has debuginfo. Record build-id of all DSOs regardless whether it's actually hit or not. =20 --buildid-mmap:: -Record build ids in mmap2 events, disables build id cache (implies --no-bu= ildid). +Legacy record build-id in map events option which is now the +default. Behaves indentically to --no-buildid. Disable with +--no-buildid-mmap. =20 --aio[=3Dn]:: Use control blocks in asynchronous (Posix AIO) trace writing mode (def= ault: 1, max: 4). diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 53971b9de3ba..a59c4e15575c 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -171,6 +171,7 @@ struct record { bool no_buildid_cache_set; bool buildid_all; bool buildid_mmap; + bool buildid_mmap_set; bool timestamp_filename; bool timestamp_boundary; bool off_cpu; @@ -1811,6 +1812,7 @@ record__finish_output(struct record *rec) data->dir.files[i].size =3D lseek(data->dir.files[i].fd, 0, SEEK_CUR); } =20 + /* Buildid scanning disabled or build ID in kernel and synthesized map ev= ents. */ if (!rec->no_buildid) { process_buildids(rec); =20 @@ -3005,6 +3007,8 @@ static int perf_record_config(const char *var, const = char *value, void *cb) rec->no_buildid =3D true; else if (!strcmp(value, "mmap")) rec->buildid_mmap =3D true; + else if (!strcmp(value, "no-mmap")) + rec->buildid_mmap =3D false; else return -1; return 0; @@ -3411,6 +3415,7 @@ static struct record record =3D { .synth =3D PERF_SYNTH_ALL, .off_cpu_thresh_ns =3D OFFCPU_THRESH, }, + .buildid_mmap =3D true, }; =20 const char record_callchain_help[] =3D CALLCHAIN_RECORD_HELP @@ -3577,8 +3582,8 @@ static struct option __record_options[] =3D { "file", "vmlinux pathname"), OPT_BOOLEAN(0, "buildid-all", &record.buildid_all, "Record build-id of all DSOs regardless of hits"), - OPT_BOOLEAN(0, "buildid-mmap", &record.buildid_mmap, - "Record build-id in map events"), + OPT_BOOLEAN_SET(0, "buildid-mmap", &record.buildid_mmap, &record.buildid_= mmap_set, + "Record build-id in mmap events and skip build-id processing."), OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename, "append timestamp to output filename"), OPT_BOOLEAN(0, "timestamp-boundary", &record.timestamp_boundary, @@ -4108,19 +4113,24 @@ int cmd_record(int argc, const char **argv) record.opts.record_switch_events =3D true; } =20 + if (!rec->buildid_mmap) { + pr_debug("Disabling build id in synthesized mmap2 events.\n"); + symbol_conf.no_buildid_mmap2 =3D true; + } else if (rec->buildid_mmap_set) { + /* + * Explicitly passing --buildid-mmap disables buildid processing + * and cache generation. + */ + rec->no_buildid =3D true; + } + if (rec->buildid_mmap && !perf_can_record_build_id()) { + pr_warning("Missing support for build id in kernel mmap events.\n" + "Disable this warning with --no-buildid-mmap\n"); + rec->buildid_mmap =3D false; + } if (rec->buildid_mmap) { - if (!perf_can_record_build_id()) { - pr_err("Failed: no support to record build id in mmap events, update yo= ur kernel.\n"); - err =3D -EINVAL; - goto out_opts; - } - pr_debug("Enabling build id in mmap2 events.\n"); - /* Enable mmap build id synthesizing. */ - symbol_conf.buildid_mmap2 =3D true; /* Enable perf_event_attr::build_id bit. */ rec->opts.build_id =3D true; - /* Disable build id cache. */ - rec->no_buildid =3D true; } =20 if (rec->opts.record_cgroup && !perf_can_record_cgroup()) { diff --git a/tools/perf/util/symbol_conf.h b/tools/perf/util/symbol_conf.h index cd9aa82c7d5a..7a80d2c14d9b 100644 --- a/tools/perf/util/symbol_conf.h +++ b/tools/perf/util/symbol_conf.h @@ -43,7 +43,7 @@ struct symbol_conf { report_individual_block, inline_name, disable_add2line_warn, - buildid_mmap2, + no_buildid_mmap2, guest_code, lazy_load_kernel_maps, keep_exited_threads, diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 69b98023ce74..638d7dd7fa4b 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -532,7 +532,7 @@ int perf_event__synthesize_mmap_events(const struct per= f_tool *tool, event->mmap2.pid =3D tgid; event->mmap2.tid =3D pid; =20 - if (symbol_conf.buildid_mmap2) + if (!symbol_conf.no_buildid_mmap2) perf_record_mmap2__read_build_id(&event->mmap2, machine, false); =20 if (perf_tool__process_synth_event(tool, event, machine, process) !=3D 0= ) { @@ -690,7 +690,7 @@ static int perf_event__synthesize_modules_maps_cb(struc= t map *map, void *data) return 0; =20 dso =3D map__dso(map); - if (symbol_conf.buildid_mmap2) { + if (!symbol_conf.no_buildid_mmap2) { size =3D PERF_ALIGN(dso__long_name_len(dso) + 1, sizeof(u64)); event->mmap2.header.type =3D PERF_RECORD_MMAP2; event->mmap2.header.size =3D (sizeof(event->mmap2) - @@ -734,9 +734,9 @@ int perf_event__synthesize_modules(const struct perf_to= ol *tool, perf_event__han .process =3D process, .machine =3D machine, }; - size_t size =3D symbol_conf.buildid_mmap2 - ? sizeof(args.event->mmap2) - : sizeof(args.event->mmap); + size_t size =3D symbol_conf.no_buildid_mmap2 + ? sizeof(args.event->mmap) + : sizeof(args.event->mmap2); =20 args.event =3D zalloc(size + machine->id_hdr_size); if (args.event =3D=3D NULL) { @@ -1124,8 +1124,8 @@ static int __perf_event__synthesize_kernel_mmap(const= struct perf_tool *tool, struct machine *machine) { union perf_event *event; - size_t size =3D symbol_conf.buildid_mmap2 ? - sizeof(event->mmap2) : sizeof(event->mmap); + size_t size =3D symbol_conf.no_buildid_mmap2 ? + sizeof(event->mmap) : sizeof(event->mmap2); struct map *map =3D machine__kernel_map(machine); struct kmap *kmap; int err; @@ -1159,7 +1159,7 @@ static int __perf_event__synthesize_kernel_mmap(const= struct perf_tool *tool, event->header.misc =3D PERF_RECORD_MISC_GUEST_KERNEL; } =20 - if (symbol_conf.buildid_mmap2) { + if (!symbol_conf.no_buildid_mmap2) { size =3D snprintf(event->mmap2.filename, sizeof(event->mmap2.filename), "%s%s", machine->mmap_name, kmap->ref_reloc_sym->name) + 1; size =3D PERF_ALIGN(size, sizeof(u64)); --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8491A2ECE9B for ; Thu, 24 Jul 2025 16:33:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374821; cv=none; b=gWGHZTvXjwKJlYhqttmGV9l3IsPyHs0WEnxkuLQ78rbBNviVXpXcjgJMOM/3r+nEofX+sx9VzTFF6s4K7T9KEZ+/AzijE23y7vtYE/qxQDsPyawVPTHi208tNoS8N8Yo053hXI4FfRZc8+3T/xpOUgZfOP1APPLhZCnkEw2S+sw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374821; c=relaxed/simple; bh=hWt/6YbpyonBX2+y7Dnsw4uX+EYw5js9GLR2q2lo/Sg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=rwmzI74fmr3g0dGxtRGOx+7/p9WUm8LeeDjj7VX2I9frIOEhSTF9S3r2qyF3FSXGnlWZR9yUzcigL81v/1OCvxJhxWjoRSgcGX5ryqLJTLnkfPB735KF7idaptXiRbmIfjKtKX/oMmJYUKOdScHX2BuOwHSAsJYXNEDj/UKy4m4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=civDJJ4q; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="civDJJ4q" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-748e1e474f8so1962161b3a.2 for ; Thu, 24 Jul 2025 09:33:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374818; x=1753979618; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=mO+rbRiTDR6FlQBr5ZxWVUFBcSyOj58M3QIN0WwdPfg=; b=civDJJ4qdljpF/GvLRASTpEQt44vwpWPwmW5rmrWEx7wezO6Dhc4yw9gUQQG/yjI7m X/1MHLcUHXqxzg98XWMHJmmMpXQkoLTDFM9e3nPlHJl5FVP29wXw71IsYSIKZ2AM3Od+ siyqNcXPFu/cABAFWaOD9D780CiGlaHdyw958ZXWjnNqMdxuP1emipIjjoaIjxtc+/A3 jdqxbzBjg8nAM2Dt1ekSUeyYUkSO/Z9QixFvkf6SuEGWTmzBvamysOTO8qb5+8A0Bq6z 1lI3UzTjcdWp+GnT4VQlS566Q/01ydIrVaQW+r4ZhvEHa/mvadRM1xgdA/M4YdV/eaHs g3fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374818; x=1753979618; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mO+rbRiTDR6FlQBr5ZxWVUFBcSyOj58M3QIN0WwdPfg=; b=hcbeffUPQCvpPMb/9FiYeOZODgWSHg3Bl36ZR8msGwsdcN2lJ1mQdFrRM8sgvHoMlu LBEtAONwV6FKc7bH+TjHGfGgHRJUNHDqRxnM4dkOocizTA5jQ/6zbYkY3LJqDO28gnIi 6DtNS7cQopu3phix80A2oMRmzWOWQ5maonn/JWaydgK7HxUvcK95FB7CHYttJz66oyGd nJm80PT7nlV3dEf0tGpHtProwZOMC12UKWLi3aRqiPC/A0o5J1VN7QQVNlbvL533VWTz w0V7qCQN4kH6+qDyx2VJ5yAKbnRaLWZTb/9RO0ngEifLZhfkkenKQxhdENjlaIme/xIh 0ZJg== X-Forwarded-Encrypted: i=1; AJvYcCW8BQZpbV6Bb1DyBYXP/jIJ9nLGwaDEoqSCoxTB8RUNwcdIXNRJiNU321Z2hzcwCcTKwqcr4sY88HTJqEU=@vger.kernel.org X-Gm-Message-State: AOJu0YzagAN2IHNv11D0cLFZnn7aefpxHOsT07df9fYhtM5QeXJ+h2os faOjKGm68P7bNV93EWMZu3P3w8/Yl95AIcTnATCcXVS0CDl+pQ6eSKc1Ljpy7D61KXSE8AUOaFt FPj1bz0TriQ== X-Google-Smtp-Source: AGHT+IG6+ia0kBj02sRX6GO6EKmAB7RaQnFmeXL5btjoRO7fcOGW30hi+GIAoUJalldRRWByMtby2LvFuopm X-Received: from pfbif3.prod.google.com ([2002:a05:6a00:8b03:b0:747:bd3b:4b63]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:b89:b0:736:3d7c:236c with SMTP id d2e1a72fcca58-760351dd745mr10559306b3a.14.1753374817557; Thu, 24 Jul 2025 09:33:37 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:49 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-10-irogers@google.com> Subject: [PATCH v6 09/22] perf session: Add accessor for session->header.env From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The perf_env from the header in the session is frequently accessed, add an accessor function rather than access directly. Cache the value to avoid repeated calls. No behavioral change. Signed-off-by: Ian Rogers --- tools/perf/builtin-annotate.c | 4 +-- tools/perf/builtin-buildid-cache.c | 2 +- tools/perf/builtin-c2c.c | 16 ++++++------ tools/perf/builtin-inject.c | 2 +- tools/perf/builtin-kmem.c | 2 +- tools/perf/builtin-kvm.c | 4 +-- tools/perf/builtin-kwork.c | 2 +- tools/perf/builtin-lock.c | 4 +-- tools/perf/builtin-mem.c | 2 +- tools/perf/builtin-record.c | 22 +++++++++-------- tools/perf/builtin-report.c | 8 +++--- tools/perf/builtin-sched.c | 8 +++--- tools/perf/builtin-script.c | 14 ++++++----- tools/perf/builtin-stat.c | 23 ++++++++--------- tools/perf/builtin-timechart.c | 2 +- tools/perf/builtin-top.c | 5 ++-- tools/perf/builtin-trace.c | 2 +- tools/perf/tests/topology.c | 38 +++++++++++++---------------- tools/perf/util/bpf-event.c | 2 +- tools/perf/util/branch.c | 2 +- tools/perf/util/data-convert-bt.c | 16 ++++++------ tools/perf/util/data-convert-json.c | 36 +++++++++++++-------------- tools/perf/util/session.c | 7 +++++- tools/perf/util/session.h | 2 ++ tools/perf/util/tool.c | 2 +- 25 files changed, 120 insertions(+), 107 deletions(-) diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 9833c2c82a2f..326593862998 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -562,7 +562,7 @@ static int __cmd_annotate(struct perf_annotate *ann) } =20 if (!annotate_opts.objdump_path) { - ret =3D perf_env__lookup_objdump(&session->header.env, + ret =3D perf_env__lookup_objdump(perf_session__env(session), &annotate_opts.objdump_path); if (ret) goto out; @@ -896,7 +896,7 @@ int cmd_annotate(int argc, const char **argv) =20 symbol_conf.try_vmlinux_path =3D true; =20 - ret =3D symbol__init(&annotate.session->header.env); + ret =3D symbol__init(perf_session__env(annotate.session)); if (ret < 0) goto out_delete; =20 diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildi= d-cache.c index e936a34b7d37..c98104481c8a 100644 --- a/tools/perf/builtin-buildid-cache.c +++ b/tools/perf/builtin-buildid-cache.c @@ -453,7 +453,7 @@ int cmd_buildid_cache(int argc, const char **argv) return PTR_ERR(session); } =20 - if (symbol__init(session ? &session->header.env : NULL) < 0) + if (symbol__init(session ? perf_session__env(session) : NULL) < 0) goto out; =20 setup_pager(); diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index e2e257bcc461..8cb36d9433f8 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -2267,14 +2267,15 @@ static int setup_nodes(struct perf_session *session) int node, idx; struct perf_cpu cpu; int *cpu2node; + struct perf_env *env =3D perf_session__env(session); =20 if (c2c.node_info > 2) c2c.node_info =3D 2; =20 - c2c.nodes_cnt =3D session->header.env.nr_numa_nodes; - c2c.cpus_cnt =3D session->header.env.nr_cpus_avail; + c2c.nodes_cnt =3D env->nr_numa_nodes; + c2c.cpus_cnt =3D env->nr_cpus_avail; =20 - n =3D session->header.env.numa_nodes; + n =3D env->numa_nodes; if (!n) return -EINVAL; =20 @@ -3030,6 +3031,7 @@ static int perf_c2c__report(int argc, const char **ar= gv) }; int err =3D 0; const char *output_str, *sort_str =3D NULL; + struct perf_env *env; =20 argc =3D parse_options(argc, argv, options, report_c2c_usage, PARSE_OPT_STOP_AT_NON_OPTION); @@ -3072,14 +3074,14 @@ static int perf_c2c__report(int argc, const char **= argv) pr_debug("Error creating perf session\n"); goto out; } - + env =3D perf_session__env(session); /* * Use the 'tot' as default display type if user doesn't specify it; * since Arm64 platform doesn't support HITMs flag, use 'peer' as the * default display type. */ if (!display) { - if (!strcmp(perf_env__arch(&session->header.env), "arm64")) + if (!strcmp(perf_env__arch(env), "arm64")) display =3D "peer"; else display =3D "tot"; @@ -3109,7 +3111,7 @@ static int perf_c2c__report(int argc, const char **ar= gv) goto out_session; } =20 - err =3D mem2node__init(&c2c.mem2node, &session->header.env); + err =3D mem2node__init(&c2c.mem2node, env); if (err) goto out_session; =20 @@ -3117,7 +3119,7 @@ static int perf_c2c__report(int argc, const char **ar= gv) if (err) goto out_mem2node; =20 - if (symbol__init(&session->header.env) < 0) + if (symbol__init(env) < 0) goto out_mem2node; =20 /* No pipe support at the moment. */ diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index 13bbb493141f..f73350a3417a 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -2608,7 +2608,7 @@ int cmd_inject(int argc, const char **argv) inject.tool.finished_round =3D perf_event__drop_oe; } #endif - ret =3D symbol__init(&inject.session->header.env); + ret =3D symbol__init(perf_session__env(inject.session)); if (ret < 0) goto out_delete; =20 diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 67fb1946ef13..7929a5fa5f46 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c @@ -2024,7 +2024,7 @@ int cmd_kmem(int argc, const char **argv) symbol_conf.use_callchain =3D true; } =20 - symbol__init(&session->header.env); + symbol__init(perf_session__env(session)); =20 if (perf_time__parse_str(&ptime, time_str) !=3D 0) { pr_err("Invalid time string\n"); diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index d75bd3684980..7b15b4a705e4 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -1175,7 +1175,7 @@ static int cpu_isa_config(struct perf_kvm_stat *kvm) } cpuid =3D buf; } else - cpuid =3D kvm->session->header.env.cpuid; + cpuid =3D perf_session__env(kvm->session)->cpuid; =20 if (!cpuid) { pr_err("Failed to look up CPU type\n"); @@ -1561,7 +1561,7 @@ static int read_events(struct perf_kvm_stat *kvm) return PTR_ERR(kvm->session); } =20 - symbol__init(&kvm->session->header.env); + symbol__init(perf_session__env(kvm->session)); =20 if (!perf_session__has_traces(kvm->session, "kvm record")) { ret =3D -EINVAL; diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c index c41a68d073de..d2e08de5976d 100644 --- a/tools/perf/builtin-kwork.c +++ b/tools/perf/builtin-kwork.c @@ -1804,7 +1804,7 @@ static int perf_kwork__read_events(struct perf_kwork = *kwork) return PTR_ERR(session); } =20 - symbol__init(&session->header.env); + symbol__init(perf_session__env(session)); =20 if (perf_kwork__check_config(kwork, session) !=3D 0) goto out_delete; diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index 3b3ade7a39ca..fd49703021fd 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -1876,7 +1876,7 @@ static int __cmd_report(bool display_info) } =20 symbol_conf.allow_aliases =3D true; - symbol__init(&session->header.env); + symbol__init(perf_session__env(session)); =20 if (!data.is_pipe) { if (!perf_session__has_traces(session, "lock record")) @@ -2042,7 +2042,7 @@ static int __cmd_contention(int argc, const char **ar= gv) con.save_callstack =3D true; =20 symbol_conf.allow_aliases =3D true; - symbol__init(&session->header.env); + symbol__init(perf_session__env(session)); =20 if (use_bpf) { err =3D target__validate(&target); diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index 5ec83cd85650..c6496adff3fe 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -304,7 +304,7 @@ static int report_raw_events(struct perf_mem *mem) goto out_delete; } =20 - ret =3D symbol__init(&session->header.env); + ret =3D symbol__init(perf_session__env(session)); if (ret < 0) goto out_delete; =20 diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index a59c4e15575c..8a829ddff6f2 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -2203,7 +2203,7 @@ static int record__setup_sb_evlist(struct record *rec) } } =20 - if (evlist__add_bpf_sb_event(rec->sb_evlist, &rec->session->header.env))= { + if (evlist__add_bpf_sb_event(rec->sb_evlist, perf_session__env(rec->sess= ion))) { pr_err("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n."); return -1; } @@ -2222,15 +2222,16 @@ static int record__init_clock(struct record *rec) struct perf_session *session =3D rec->session; struct timespec ref_clockid; struct timeval ref_tod; + struct perf_env *env =3D perf_session__env(session); u64 ref; =20 if (!rec->opts.use_clockid) return 0; =20 if (rec->opts.use_clockid && rec->opts.clockid_res_ns) - session->header.env.clock.clockid_res_ns =3D rec->opts.clockid_res_ns; + env->clock.clockid_res_ns =3D rec->opts.clockid_res_ns; =20 - session->header.env.clock.clockid =3D rec->opts.clockid; + env->clock.clockid =3D rec->opts.clockid; =20 if (gettimeofday(&ref_tod, NULL) !=3D 0) { pr_err("gettimeofday failed, cannot set reference time.\n"); @@ -2245,12 +2246,12 @@ static int record__init_clock(struct record *rec) ref =3D (u64) ref_tod.tv_sec * NSEC_PER_SEC + (u64) ref_tod.tv_usec * NSEC_PER_USEC; =20 - session->header.env.clock.tod_ns =3D ref; + env->clock.tod_ns =3D ref; =20 ref =3D (u64) ref_clockid.tv_sec * NSEC_PER_SEC + (u64) ref_clockid.tv_nsec; =20 - session->header.env.clock.clockid_ns =3D ref; + env->clock.clockid_ns =3D ref; return 0; } =20 @@ -2396,6 +2397,7 @@ static int __cmd_record(struct record *rec, int argc,= const char **argv) int fd; float ratio =3D 0; enum evlist_ctl_cmd cmd =3D EVLIST_CTL_CMD_UNSUPPORTED; + struct perf_env *env; =20 atexit(record__sig_exit); signal(SIGCHLD, sig_handler); @@ -2437,7 +2439,7 @@ static int __cmd_record(struct record *rec, int argc,= const char **argv) pr_err("Perf session creation failed.\n"); return PTR_ERR(session); } - + env =3D perf_session__env(session); if (record__threads_enabled(rec)) { if (perf_data__is_pipe(&rec->data)) { pr_err("Parallel trace streaming is not available in pipe mode.\n"); @@ -2471,8 +2473,8 @@ static int __cmd_record(struct record *rec, int argc,= const char **argv) } #endif // HAVE_EVENTFD_SUPPORT =20 - session->header.env.comp_type =3D PERF_COMP_ZSTD; - session->header.env.comp_level =3D rec->opts.comp_level; + env->comp_type =3D PERF_COMP_ZSTD; + env->comp_level =3D rec->opts.comp_level; =20 if (rec->opts.kcore && !record__kcore_readable(&session->machines.host)) { @@ -2525,7 +2527,7 @@ static int __cmd_record(struct record *rec, int argc,= const char **argv) } /* Debug message used by test scripts */ pr_debug3("perf record done opening and mmapping events\n"); - session->header.env.comp_mmap_len =3D session->evlist->core.mmap_len; + env->comp_mmap_len =3D session->evlist->core.mmap_len; =20 if (rec->opts.kcore) { err =3D record__kcore_copy(&session->machines.host, data); @@ -2855,7 +2857,7 @@ static int __cmd_record(struct record *rec, int argc,= const char **argv) =20 if (rec->session->bytes_transferred && rec->session->bytes_compressed) { ratio =3D (float)rec->session->bytes_transferred/(float)rec->session->by= tes_compressed; - session->header.env.comp_ratio =3D ratio + 0.5; + env->comp_ratio =3D ratio + 0.5; } =20 if (forks) { diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 26186717fe9b..704576e46e4b 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -447,7 +447,7 @@ static int report__setup_sample_type(struct report *rep) } } =20 - callchain_param_setup(sample_type, perf_env__arch(&rep->session->header.e= nv)); + callchain_param_setup(sample_type, perf_env__arch(perf_session__env(rep->= session))); =20 if (rep->stitch_lbr && (callchain_param.record_mode !=3D CALLCHAIN_LBR)) { ui__warning("Can't find LBR callchain. Switch off --stitch-lbr.\n" @@ -550,7 +550,7 @@ static int evlist__tui_block_hists_browse(struct evlist= *evlist, struct report * evlist__for_each_entry(evlist, pos) { ret =3D report__browse_block_hists(&rep->block_reports[i++].hist, rep->min_percent, pos, - &rep->session->header.env); + perf_session__env(rep->session)); if (ret !=3D 0) return ret; } @@ -685,7 +685,7 @@ static int report__browse_hists(struct report *rep) } =20 ret =3D evlist__tui_browse_hists(evlist, help, NULL, rep->min_percent, - &session->header.env, true); + perf_session__env(session), true); /* * Usually "ret" is the last pressed key, and we only * care if the key notifies us to switch data file. @@ -1842,7 +1842,7 @@ int cmd_report(int argc, const char **argv) annotation_config__init(); } =20 - if (symbol__init(&session->header.env) < 0) + if (symbol__init(perf_session__env(session)) < 0) goto error; =20 if (report.time_str) { diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 34051ad23493..f166d6cbc083 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -1939,7 +1939,7 @@ static int perf_sched__read_events(struct perf_sched = *sched) return PTR_ERR(session); } =20 - symbol__init(&session->header.env); + symbol__init(perf_session__env(session)); =20 /* prefer sched_waking if it is captured */ if (evlist__find_tracepoint_by_name(session->evlist, "sched:sched_waking"= )) @@ -3294,6 +3294,7 @@ static int perf_sched__timehist(struct perf_sched *sc= hed) }; =20 struct perf_session *session; + struct perf_env *env; struct evlist *evlist; int err =3D -1; =20 @@ -3318,6 +3319,7 @@ static int perf_sched__timehist(struct perf_sched *sc= hed) if (IS_ERR(session)) return PTR_ERR(session); =20 + env =3D perf_session__env(session); if (cpu_list) { err =3D perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap); if (err < 0) @@ -3326,7 +3328,7 @@ static int perf_sched__timehist(struct perf_sched *sc= hed) =20 evlist =3D session->evlist; =20 - symbol__init(&session->header.env); + symbol__init(env); =20 if (perf_time__parse_str(&sched->ptime, sched->time_str) !=3D 0) { pr_err("Invalid time string\n"); @@ -3365,7 +3367,7 @@ static int perf_sched__timehist(struct perf_sched *sc= hed) goto out; =20 /* pre-allocate struct for per-CPU idle stats */ - sched->max_cpu.cpu =3D session->header.env.nr_cpus_online; + sched->max_cpu.cpu =3D env->nr_cpus_online; if (sched->max_cpu.cpu =3D=3D 0) sched->max_cpu.cpu =3D 4; if (init_idle_threads(sched->max_cpu.cpu)) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 271f22962e32..31cce67217b0 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -714,7 +714,7 @@ static int perf_session__check_output_opt(struct perf_s= ession *session) } } =20 - if (tod && !session->header.env.clock.enabled) { + if (tod && !perf_session__env(session)->clock.enabled) { pr_err("Can't provide 'tod' time, missing clock data. " "Please record with -k/--clockid option.\n"); return -1; @@ -759,7 +759,7 @@ tod_scnprintf(struct perf_script *script, char *buf, in= t buflen, if (buflen < 64 || !script) return buf; =20 - env =3D &script->session->header.env; + env =3D perf_session__env(script->session); if (!env->clock.enabled) { scnprintf(buf, buflen, "disabled"); return buf; @@ -3863,6 +3863,7 @@ int cmd_script(int argc, const char **argv) "perf script [] [script-args]", NULL }; + struct perf_env *env; =20 perf_set_singlethreaded(); =20 @@ -4109,6 +4110,7 @@ int cmd_script(int argc, const char **argv) if (IS_ERR(session)) return PTR_ERR(session); =20 + env =3D perf_session__env(session); if (header || header_only) { script.tool.show_feat_hdr =3D SHOW_FEAT_HEADER; perf_session__fprintf_info(session, stdout, show_full_info); @@ -4118,17 +4120,17 @@ int cmd_script(int argc, const char **argv) if (show_full_info) script.tool.show_feat_hdr =3D SHOW_FEAT_HEADER_FULL_INFO; =20 - if (symbol__init(&session->header.env) < 0) + if (symbol__init(env) < 0) goto out_delete; =20 uname(&uts); if (data.is_pipe) { /* Assume pipe_mode indicates native_arch */ native_arch =3D true; - } else if (session->header.env.arch) { - if (!strcmp(uts.machine, session->header.env.arch)) + } else if (env->arch) { + if (!strcmp(uts.machine, env->arch)) native_arch =3D true; else if (!strcmp(uts.machine, "x86_64") && - !strcmp(session->header.env.arch, "i386")) + !strcmp(env->arch, "i386")) native_arch =3D true; } =20 diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 77e2248fa7fc..8b0a0a9ef631 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1692,48 +1692,48 @@ static struct aggr_cpu_id perf_env__get_global_aggr= _by_cpu(struct perf_cpu cpu _ static struct aggr_cpu_id perf_stat__get_socket_file(struct perf_stat_conf= ig *config __maybe_unused, struct perf_cpu cpu) { - return perf_env__get_socket_aggr_by_cpu(cpu, &perf_stat.session->header.e= nv); + return perf_env__get_socket_aggr_by_cpu(cpu, perf_session__env(perf_stat.= session)); } static struct aggr_cpu_id perf_stat__get_die_file(struct perf_stat_config = *config __maybe_unused, struct perf_cpu cpu) { - return perf_env__get_die_aggr_by_cpu(cpu, &perf_stat.session->header.env); + return perf_env__get_die_aggr_by_cpu(cpu, perf_session__env(perf_stat.ses= sion)); } =20 static struct aggr_cpu_id perf_stat__get_cluster_file(struct perf_stat_con= fig *config __maybe_unused, struct perf_cpu cpu) { - return perf_env__get_cluster_aggr_by_cpu(cpu, &perf_stat.session->header.= env); + return perf_env__get_cluster_aggr_by_cpu(cpu, perf_session__env(perf_stat= .session)); } =20 static struct aggr_cpu_id perf_stat__get_cache_file(struct perf_stat_confi= g *config __maybe_unused, struct perf_cpu cpu) { - return perf_env__get_cache_aggr_by_cpu(cpu, &perf_stat.session->header.en= v); + return perf_env__get_cache_aggr_by_cpu(cpu, perf_session__env(perf_stat.s= ession)); } =20 static struct aggr_cpu_id perf_stat__get_core_file(struct perf_stat_config= *config __maybe_unused, struct perf_cpu cpu) { - return perf_env__get_core_aggr_by_cpu(cpu, &perf_stat.session->header.env= ); + return perf_env__get_core_aggr_by_cpu(cpu, perf_session__env(perf_stat.se= ssion)); } =20 static struct aggr_cpu_id perf_stat__get_cpu_file(struct perf_stat_config = *config __maybe_unused, struct perf_cpu cpu) { - return perf_env__get_cpu_aggr_by_cpu(cpu, &perf_stat.session->header.env); + return perf_env__get_cpu_aggr_by_cpu(cpu, perf_session__env(perf_stat.ses= sion)); } =20 static struct aggr_cpu_id perf_stat__get_node_file(struct perf_stat_config= *config __maybe_unused, struct perf_cpu cpu) { - return perf_env__get_node_aggr_by_cpu(cpu, &perf_stat.session->header.env= ); + return perf_env__get_node_aggr_by_cpu(cpu, perf_session__env(perf_stat.se= ssion)); } =20 static struct aggr_cpu_id perf_stat__get_global_file(struct perf_stat_conf= ig *config __maybe_unused, struct perf_cpu cpu) { - return perf_env__get_global_aggr_by_cpu(cpu, &perf_stat.session->header.e= nv); + return perf_env__get_global_aggr_by_cpu(cpu, perf_session__env(perf_stat.= session)); } =20 static aggr_cpu_id_get_t aggr_mode__get_aggr_file(enum aggr_mode aggr_mode) @@ -1792,7 +1792,7 @@ static aggr_get_id_t aggr_mode__get_id_file(enum aggr= _mode aggr_mode) =20 static int perf_stat_init_aggr_mode_file(struct perf_stat *st) { - struct perf_env *env =3D &st->session->header.env; + struct perf_env *env =3D perf_session__env(st->session); aggr_cpu_id_get_t get_id =3D aggr_mode__get_aggr_file(stat_config.aggr_mo= de); bool needs_sort =3D stat_config.aggr_mode !=3D AGGR_NONE; =20 @@ -2115,8 +2115,9 @@ static int process_stat_round_event(struct perf_sessi= on *session, { struct perf_record_stat_round *stat_round =3D &event->stat_round; struct timespec tsh, *ts =3D NULL; - const char **argv =3D session->header.env.cmdline_argv; - int argc =3D session->header.env.nr_cmdline; + struct perf_env *env =3D perf_session__env(session); + const char **argv =3D env->cmdline_argv; + int argc =3D env->nr_cmdline; =20 process_counters(); =20 diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 068d297aaf44..22050c640dfa 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c @@ -1618,7 +1618,7 @@ static int __cmd_timechart(struct timechart *tchart, = const char *output_name) if (IS_ERR(session)) return PTR_ERR(session); =20 - symbol__init(&session->header.env); + symbol__init(perf_session__env(session)); =20 (void)perf_header__process_sections(&session->header, perf_data__fd(session->data), diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index c77e195ea786..87d5742b7eb7 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -647,7 +647,8 @@ static void *display_thread_tui(void *arg) } =20 ret =3D evlist__tui_browse_hists(top->evlist, help, &hbt, top->min_percen= t, - &top->session->header.env, !top->record_opts.overwrite); + perf_session__env(top->session), + !top->record_opts.overwrite); if (ret =3D=3D K_RELOAD) { top->zero =3D true; goto repeat; @@ -1253,7 +1254,7 @@ static int __cmd_top(struct perf_top *top) int ret; =20 if (!annotate_opts.objdump_path) { - ret =3D perf_env__lookup_objdump(&top->session->header.env, + ret =3D perf_env__lookup_objdump(perf_session__env(top->session), &annotate_opts.objdump_path); if (ret) return ret; diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index bb2dbc1d2ffa..0261f4eefe6d 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -4701,7 +4701,7 @@ static int trace__replay(struct trace *trace) if (trace->opts.target.tid) symbol_conf.tid_list_str =3D strdup(trace->opts.target.tid); =20 - if (symbol__init(&session->header.env) < 0) + if (symbol__init(perf_session__env(session)) < 0) goto out; =20 trace->host =3D &session->machines.host; diff --git a/tools/perf/tests/topology.c b/tools/perf/tests/topology.c index a8cb5ba898ab..bc7d10630dad 100644 --- a/tools/perf/tests/topology.c +++ b/tools/perf/tests/topology.c @@ -69,9 +69,11 @@ static int check_cpu_topology(char *path, struct perf_cp= u_map *map) int i; struct aggr_cpu_id id; struct perf_cpu cpu; + struct perf_env *env; =20 session =3D perf_session__new(&data, NULL); TEST_ASSERT_VAL("can't get session", !IS_ERR(session)); + env =3D perf_session__env(session); cpu__setup_cpunode_map(); =20 /* On platforms with large numbers of CPUs process_cpu_topology() @@ -95,9 +97,7 @@ static int check_cpu_topology(char *path, struct perf_cpu= _map *map) * condition is true (see do_core_id_test in header.c). So always * run this test on those platforms. */ - if (!session->header.env.cpu - && strncmp(session->header.env.arch, "s390", 4) - && strncmp(session->header.env.arch, "aarch64", 7)) + if (!env->cpu && strncmp(env->arch, "s390", 4) && strncmp(env->arch, "aar= ch64", 7)) return TEST_SKIP; =20 /* @@ -106,20 +106,20 @@ static int check_cpu_topology(char *path, struct perf= _cpu_map *map) * physical_package_id will be set to -1. Hence skip this * test if physical_package_id returns -1 for cpu from perf_cpu_map. */ - if (!strncmp(session->header.env.arch, "ppc64le", 7)) { + if (!strncmp(env->arch, "ppc64le", 7)) { if (cpu__get_socket_id(perf_cpu_map__cpu(map, 0)) =3D=3D -1) return TEST_SKIP; } =20 - TEST_ASSERT_VAL("Session header CPU map not set", session->header.env.cpu= ); + TEST_ASSERT_VAL("Session header CPU map not set", env->cpu); =20 - for (i =3D 0; i < session->header.env.nr_cpus_avail; i++) { + for (i =3D 0; i < env->nr_cpus_avail; i++) { cpu.cpu =3D i; if (!perf_cpu_map__has(map, cpu)) continue; pr_debug("CPU %d, core %d, socket %d\n", i, - session->header.env.cpu[i].core_id, - session->header.env.cpu[i].socket_id); + env->cpu[i].core_id, + env->cpu[i].socket_id); } =20 // Test that CPU ID contains socket, die, core and CPU @@ -129,13 +129,12 @@ static int check_cpu_topology(char *path, struct perf= _cpu_map *map) cpu.cpu =3D=3D id.cpu.cpu); =20 TEST_ASSERT_VAL("Cpu map - Core ID doesn't match", - session->header.env.cpu[cpu.cpu].core_id =3D=3D id.core); + env->cpu[cpu.cpu].core_id =3D=3D id.core); TEST_ASSERT_VAL("Cpu map - Socket ID doesn't match", - session->header.env.cpu[cpu.cpu].socket_id =3D=3D - id.socket); + env->cpu[cpu.cpu].socket_id =3D=3D id.socket); =20 TEST_ASSERT_VAL("Cpu map - Die ID doesn't match", - session->header.env.cpu[cpu.cpu].die_id =3D=3D id.die); + env->cpu[cpu.cpu].die_id =3D=3D id.die); TEST_ASSERT_VAL("Cpu map - Node ID is set", id.node =3D=3D -1); TEST_ASSERT_VAL("Cpu map - Thread IDX is set", id.thread_idx =3D=3D -1); } @@ -144,14 +143,13 @@ static int check_cpu_topology(char *path, struct perf= _cpu_map *map) perf_cpu_map__for_each_cpu(cpu, i, map) { id =3D aggr_cpu_id__core(cpu, NULL); TEST_ASSERT_VAL("Core map - Core ID doesn't match", - session->header.env.cpu[cpu.cpu].core_id =3D=3D id.core); + env->cpu[cpu.cpu].core_id =3D=3D id.core); =20 TEST_ASSERT_VAL("Core map - Socket ID doesn't match", - session->header.env.cpu[cpu.cpu].socket_id =3D=3D - id.socket); + env->cpu[cpu.cpu].socket_id =3D=3D id.socket); =20 TEST_ASSERT_VAL("Core map - Die ID doesn't match", - session->header.env.cpu[cpu.cpu].die_id =3D=3D id.die); + env->cpu[cpu.cpu].die_id =3D=3D id.die); TEST_ASSERT_VAL("Core map - Node ID is set", id.node =3D=3D -1); TEST_ASSERT_VAL("Core map - Thread IDX is set", id.thread_idx =3D=3D -1); } @@ -160,11 +158,10 @@ static int check_cpu_topology(char *path, struct perf= _cpu_map *map) perf_cpu_map__for_each_cpu(cpu, i, map) { id =3D aggr_cpu_id__die(cpu, NULL); TEST_ASSERT_VAL("Die map - Socket ID doesn't match", - session->header.env.cpu[cpu.cpu].socket_id =3D=3D - id.socket); + env->cpu[cpu.cpu].socket_id =3D=3D id.socket); =20 TEST_ASSERT_VAL("Die map - Die ID doesn't match", - session->header.env.cpu[cpu.cpu].die_id =3D=3D id.die); + env->cpu[cpu.cpu].die_id =3D=3D id.die); =20 TEST_ASSERT_VAL("Die map - Node ID is set", id.node =3D=3D -1); TEST_ASSERT_VAL("Die map - Core is set", id.core =3D=3D -1); @@ -176,8 +173,7 @@ static int check_cpu_topology(char *path, struct perf_c= pu_map *map) perf_cpu_map__for_each_cpu(cpu, i, map) { id =3D aggr_cpu_id__socket(cpu, NULL); TEST_ASSERT_VAL("Socket map - Socket ID doesn't match", - session->header.env.cpu[cpu.cpu].socket_id =3D=3D - id.socket); + env->cpu[cpu.cpu].socket_id =3D=3D id.socket); =20 TEST_ASSERT_VAL("Socket map - Node ID is set", id.node =3D=3D -1); TEST_ASSERT_VAL("Socket map - Die ID is set", id.die =3D=3D -1); diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c index dc09a4730c50..664f361ef8c1 100644 --- a/tools/perf/util/bpf-event.c +++ b/tools/perf/util/bpf-event.c @@ -549,7 +549,7 @@ static int perf_event__synthesize_one_bpf_prog(struct p= erf_session *session, * for perf-record and perf-report use header.env; * otherwise, use global perf_env. */ - env =3D session->data ? &session->header.env : &perf_env; + env =3D session->data ? perf_session__env(session) : &perf_env; =20 arrays =3D 1UL << PERF_BPIL_JITED_KSYMS; arrays |=3D 1UL << PERF_BPIL_JITED_FUNC_LENS; diff --git a/tools/perf/util/branch.c b/tools/perf/util/branch.c index ab760e267d41..3712be067464 100644 --- a/tools/perf/util/branch.c +++ b/tools/perf/util/branch.c @@ -46,7 +46,7 @@ const char *branch_new_type_name(int new_type) "FAULT_DATA", "FAULT_INST", /* - * TODO: This switch should happen on 'session->header.env.arch' + * TODO: This switch should happen on 'perf_session__env(session)->arch' * instead, because an arm64 platform perf recording could be * opened for analysis on other platforms as well. */ diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-conve= rt-bt.c index 5e7ff09fbc95..3d2e437e1354 100644 --- a/tools/perf/util/data-convert-bt.c +++ b/tools/perf/util/data-convert-bt.c @@ -1338,14 +1338,14 @@ static void cleanup_events(struct perf_session *ses= sion) static int setup_streams(struct ctf_writer *cw, struct perf_session *sessi= on) { struct ctf_stream **stream; - struct perf_header *ph =3D &session->header; + struct perf_env *env =3D perf_session__env(session); int ncpus; =20 /* * Try to get the number of cpus used in the data file, * if not present fallback to the MAX_CPUS. */ - ncpus =3D ph->env.nr_cpus_avail ?: MAX_CPUS; + ncpus =3D env->nr_cpus_avail ?: MAX_CPUS; =20 stream =3D zalloc(sizeof(*stream) * ncpus); if (!stream) { @@ -1371,7 +1371,7 @@ static void free_streams(struct ctf_writer *cw) static int ctf_writer__setup_env(struct ctf_writer *cw, struct perf_session *session) { - struct perf_header *header =3D &session->header; + struct perf_env *env =3D perf_session__env(session); struct bt_ctf_writer *writer =3D cw->writer; =20 #define ADD(__n, __v) \ @@ -1380,11 +1380,11 @@ do { \ return -1; \ } while (0) =20 - ADD("host", header->env.hostname); + ADD("host", env->hostname); ADD("sysname", "Linux"); - ADD("release", header->env.os_release); - ADD("version", header->env.version); - ADD("machine", header->env.arch); + ADD("release", env->os_release); + ADD("version", env->version); + ADD("machine", env->arch); ADD("domain", "kernel"); ADD("tracer_name", "perf"); =20 @@ -1401,7 +1401,7 @@ static int ctf_writer__setup_clock(struct ctf_writer = *cw, int64_t offset =3D 0; =20 if (tod) { - struct perf_env *env =3D &session->header.env; + struct perf_env *env =3D perf_session__env(session); =20 if (!env->clock.enabled) { pr_err("Can't provide --tod time, missing clock data. " diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-con= vert-json.c index d9f805bf6fb0..9dc1e184cf3c 100644 --- a/tools/perf/util/data-convert-json.c +++ b/tools/perf/util/data-convert-json.c @@ -257,7 +257,8 @@ static int process_sample_event(const struct perf_tool = *tool, static void output_headers(struct perf_session *session, struct convert_js= on *c) { struct stat st; - struct perf_header *header =3D &session->header; + const struct perf_header *header =3D &session->header; + const struct perf_env *env =3D perf_session__env(session); int ret; int fd =3D perf_data__fd(session->data); int i; @@ -280,32 +281,32 @@ static void output_headers(struct perf_session *sessi= on, struct convert_json *c) output_json_key_format(out, true, 2, "data-size", "%" PRIu64, header->dat= a_size); output_json_key_format(out, true, 2, "feat-offset", "%" PRIu64, header->f= eat_offset); =20 - output_json_key_string(out, true, 2, "hostname", header->env.hostname); - output_json_key_string(out, true, 2, "os-release", header->env.os_release= ); - output_json_key_string(out, true, 2, "arch", header->env.arch); + output_json_key_string(out, true, 2, "hostname", env->hostname); + output_json_key_string(out, true, 2, "os-release", env->os_release); + output_json_key_string(out, true, 2, "arch", env->arch); =20 - if (header->env.cpu_desc) - output_json_key_string(out, true, 2, "cpu-desc", header->env.cpu_desc); + if (env->cpu_desc) + output_json_key_string(out, true, 2, "cpu-desc", env->cpu_desc); =20 - output_json_key_string(out, true, 2, "cpuid", header->env.cpuid); - output_json_key_format(out, true, 2, "nrcpus-online", "%u", header->env.n= r_cpus_online); - output_json_key_format(out, true, 2, "nrcpus-avail", "%u", header->env.nr= _cpus_avail); + output_json_key_string(out, true, 2, "cpuid", env->cpuid); + output_json_key_format(out, true, 2, "nrcpus-online", "%u", env->nr_cpus_= online); + output_json_key_format(out, true, 2, "nrcpus-avail", "%u", env->nr_cpus_a= vail); =20 - if (header->env.clock.enabled) { + if (env->clock.enabled) { output_json_key_format(out, true, 2, "clockid", - "%u", header->env.clock.clockid); + "%u", env->clock.clockid); output_json_key_format(out, true, 2, "clock-time", - "%" PRIu64, header->env.clock.clockid_ns); + "%" PRIu64, env->clock.clockid_ns); output_json_key_format(out, true, 2, "real-time", - "%" PRIu64, header->env.clock.tod_ns); + "%" PRIu64, env->clock.tod_ns); } =20 - output_json_key_string(out, true, 2, "perf-version", header->env.version); + output_json_key_string(out, true, 2, "perf-version", env->version); =20 output_json_key_format(out, true, 2, "cmdline", "["); - for (i =3D 0; i < header->env.nr_cmdline; i++) { + for (i =3D 0; i < env->nr_cmdline; i++) { output_json_delimiters(out, i !=3D 0, 3); - output_json_string(c->out, header->env.cmdline_argv[i]); + output_json_string(c->out, env->cmdline_argv[i]); } output_json_format(out, false, 2, "]"); } @@ -376,8 +377,7 @@ int bt_convert__perf2json(const char *input_name, const= char *output_name, fprintf(stderr, "Error creating perf session!\n"); goto err_fclose; } - - if (symbol__init(&session->header.env) < 0) { + if (symbol__init(perf_session__env(session)) < 0) { fprintf(stderr, "Symbol init error!\n"); goto err_session_delete; } diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 38075059086c..b09d157f7d04 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -2558,7 +2558,7 @@ int perf_session__cpu_bitmap(struct perf_session *ses= sion, { int i, err =3D -1; struct perf_cpu_map *map; - int nr_cpus =3D min(session->header.env.nr_cpus_avail, MAX_NR_CPUS); + int nr_cpus =3D min(perf_session__env(session)->nr_cpus_avail, MAX_NR_CPU= S); struct perf_cpu cpu; =20 for (i =3D 0; i < PERF_TYPE_MAX; ++i) { @@ -2747,3 +2747,8 @@ int perf_session__dsos_hit_all(struct perf_session *s= ession) =20 return 0; } + +struct perf_env *perf_session__env(struct perf_session *session) +{ + return &session->header.env; +} diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index db1c120a9e67..e7f7464b838f 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -208,4 +208,6 @@ int perf_event__process_finished_round(const struct per= f_tool *tool, union perf_event *event, struct ordered_events *oe); =20 +struct perf_env *perf_session__env(struct perf_session *session); + #endif /* __PERF_SESSION_H */ diff --git a/tools/perf/util/tool.c b/tools/perf/util/tool.c index 204ec03071bc..e83c7ababc2a 100644 --- a/tools/perf/util/tool.c +++ b/tools/perf/util/tool.c @@ -20,7 +20,7 @@ static int perf_session__process_compressed_event(struct = perf_session *session, void *src; size_t decomp_size, src_size; u64 decomp_last_rem =3D 0; - size_t mmap_len, decomp_len =3D session->header.env.comp_mmap_len; + size_t mmap_len, decomp_len =3D perf_session__env(session)->comp_mmap_len; struct decomp *decomp, *decomp_last =3D session->active_decomp->decomp_la= st; =20 if (decomp_last) { --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DBAC02ED15D for ; Thu, 24 Jul 2025 16:33:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374822; cv=none; b=b+fUtqt9VR1ji+QqJipqKRVHm4Hwl1L7FJDUVySyAke6hy06GJrbSRuLrrtKaOQs8Bzrb/E2uUA49UMlr2YZD7TiED2kaTbStvBn/s1rWmxtUmatiN+MyaGmpOmCtbmSTYIlNz++ysgX95nsBlb/MLgL5nG9xz+xWQVGCeKWpfc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374822; c=relaxed/simple; bh=p4OOtBZXP/hcR4TV7/XmfIwE6bIMEydNNz4oP3ouRxs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=msEJ0K2OakGDW4jz0X3F0zkhkQ9Ij6PD7ItSAtAQjShVWUfCNpf/Aid95W8YOhOxBeNh4atimvJ6RblPReak35JV2Dj+/75W/gimomQkdxmiYb8AuzxFL9+oKsX+X3lmGZml9xsgEonrwSOZ9ao2M/nVfwNFe+ITIraVpHngxGE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=yRB5xRC6; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="yRB5xRC6" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-313f702d37fso1439823a91.3 for ; Thu, 24 Jul 2025 09:33:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374820; x=1753979620; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=pi9ebDUjouho2rHSFJP8v3MSTtny3s9gM+6XGmTbhio=; b=yRB5xRC6KsfHHdGvQTctpkISHcVtZB2jlMoivve/0sKcoylIIbD/aPgP4v/TsQxN79 Umv2hBeQHbLz1VNlQszCifwD+y2XoDGIdk3+wMUIgN8xUeHIJXe1YGXM+HqmhM0Y8Bff h/Oqsmp8bBe3H3wqYgpkQ7/6UEvhsopxPBM9GiZpse/sGefH3navVLZPpv8oM9wXIIC2 qlqPxmOUpNme1Iy0w+hp+ioBlxTDBjgiXt5AhY2uaN+NxRjCDdrFSubOfx4omq14iAD1 ia5tCXson7dQXQrvYKa+L2kMxpWP5Gu4gQb3k4URbXEapcR8z17YiA5QyLJYITDC1ZIL Ep3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374820; x=1753979620; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=pi9ebDUjouho2rHSFJP8v3MSTtny3s9gM+6XGmTbhio=; b=X6SvdeXJuq46pLCqeVEUm/W1ySFFm4Ol3iS0DiD3T/QNzQ58v8FySkDnoSh6veiUqJ 6qLJHhxMDzNSowtrCdPdnZX5fdK5A3FhtyVFoI/jtC7lQq+qRllx8K8LmCFRwv3+uGxT 4Um0PPiRNTSGCo0Abp0V5odIPQaGHBtjjM0yBsoMfz7+Ffcq1hvzk0/u87Wf1ydBIxMh K10C7EYUkblPnxSWtgWoFcODeYXdRSoTEz+xlKxaOH6GbnSz2GTgKeuk732dgxk1K3yN 86w6xyNKHcXrBqWIhvogYID6Fil1xgwBs5ONB1CvRpnaAg6Rkk51KK0R6VMcTepy68Wm 0Y+w== X-Forwarded-Encrypted: i=1; AJvYcCVHGgle9H7zloDal4jRdOH7ep4VnKYsned6aZ54bkPAeyzas2DBLvHyjSuvyZ646tfw15CCsmpdZihcM8k=@vger.kernel.org X-Gm-Message-State: AOJu0YzThr2kQgH4g6qLiyVXiAgQYR4R1BD4hdFBBBnxjSGkFD5n05Y+ L+EK1ide84/6nAYjxYyxKxrPe6SNaEI6LTirX1uBYFfh8r3b+//qni6jSJUV64DmVbkEQ6mELBq n/OKFGHbr3g== X-Google-Smtp-Source: AGHT+IG3IJiQfngE2nOsi/1oZ1HgGGC1rKZMmthyyeJdII1TqmNowfo99ZzuKSGfMk4oesN7dzTmOC83vFwt X-Received: from pjbsp12.prod.google.com ([2002:a17:90b:52cc:b0:312:1af5:98c9]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3909:b0:313:287c:74bd with SMTP id 98e67ed59e1d1-31e508579c1mr11346126a91.33.1753374819866; Thu, 24 Jul 2025 09:33:39 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:50 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-11-irogers@google.com> Subject: [PATCH v6 10/22] perf evlist: Change env variable to session From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The session holds a perf_env pointer env. In UI code container_of is used to turn the env to a session, but this assumes the session header's env is in use. Rather than a dubious container_of, hold the session in the evlist and derive the env from the session with evsel__env, perf_session__env, etc. Signed-off-by: Ian Rogers --- tools/perf/builtin-report.c | 6 +++++- tools/perf/builtin-script.c | 2 +- tools/perf/builtin-top.c | 2 +- tools/perf/tests/topology.c | 1 + tools/perf/ui/browser.h | 4 ++-- tools/perf/ui/browsers/header.c | 4 +--- tools/perf/ui/browsers/hists.c | 2 +- tools/perf/util/amd-sample-raw.c | 2 +- tools/perf/util/arm-spe.c | 2 +- tools/perf/util/evlist.h | 2 +- tools/perf/util/evsel.c | 12 +++++++++--- tools/perf/util/evsel.h | 1 + tools/perf/util/header.c | 2 +- tools/perf/util/s390-cpumsf.c | 2 +- tools/perf/util/sample-raw.c | 7 ++++--- tools/perf/util/sample-raw.h | 2 +- tools/perf/util/session.c | 4 +++- 17 files changed, 35 insertions(+), 22 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 704576e46e4b..ada8e0166c78 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1274,6 +1274,8 @@ static int process_attr(const struct perf_tool *tool = __maybe_unused, union perf_event *event, struct evlist **pevlist) { + struct perf_session *session; + struct perf_env *env; u64 sample_type; int err; =20 @@ -1286,7 +1288,9 @@ static int process_attr(const struct perf_tool *tool = __maybe_unused, * on events sample_type. */ sample_type =3D evlist__combined_sample_type(*pevlist); - callchain_param_setup(sample_type, perf_env__arch((*pevlist)->env)); + session =3D (*pevlist)->session; + env =3D perf_session__env(session); + callchain_param_setup(sample_type, perf_env__arch(env)); return 0; } =20 diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 31cce67217b0..f2b5620165b4 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2534,7 +2534,7 @@ static int process_attr(const struct perf_tool *tool,= union perf_event *event, * on events sample_type. */ sample_type =3D evlist__combined_sample_type(evlist); - callchain_param_setup(sample_type, perf_env__arch((*pevlist)->env)); + callchain_param_setup(sample_type, perf_env__arch(perf_session__env(scr->= session))); =20 /* Enable fields for callchain entries */ if (symbol_conf.use_callchain && diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 87d5742b7eb7..2760971d4c97 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1654,7 +1654,6 @@ int cmd_top(int argc, const char **argv) "Couldn't read the cpuid for this machine: %s\n", str_error_r(errno, errbuf, sizeof(errbuf))); } - top.evlist->env =3D &perf_env; =20 argc =3D parse_options(argc, argv, options, top_usage, 0); if (argc) @@ -1830,6 +1829,7 @@ int cmd_top(int argc, const char **argv) perf_top__update_print_entries(&top); signal(SIGWINCH, winch_sig); } + top.session->env =3D &perf_env; =20 top.session =3D perf_session__new(NULL, NULL); if (IS_ERR(top.session)) { diff --git a/tools/perf/tests/topology.c b/tools/perf/tests/topology.c index bc7d10630dad..ec01150d208d 100644 --- a/tools/perf/tests/topology.c +++ b/tools/perf/tests/topology.c @@ -43,6 +43,7 @@ static int session_write_header(char *path) =20 session->evlist =3D evlist__new_default(); TEST_ASSERT_VAL("can't get evlist", session->evlist); + session->evlist->session =3D session; =20 perf_header__set_feat(&session->header, HEADER_CPU_TOPOLOGY); perf_header__set_feat(&session->header, HEADER_NRCPUS); diff --git a/tools/perf/ui/browser.h b/tools/perf/ui/browser.h index f59ad4f14d33..9d4404f9b87f 100644 --- a/tools/perf/ui/browser.h +++ b/tools/perf/ui/browser.h @@ -71,8 +71,8 @@ int ui_browser__help_window(struct ui_browser *browser, c= onst char *text); bool ui_browser__dialog_yesno(struct ui_browser *browser, const char *text= ); int ui_browser__input_window(const char *title, const char *text, char *in= put, const char *exit_msg, int delay_sec); -struct perf_env; -int tui__header_window(struct perf_env *env); +struct perf_session; +int tui__header_window(struct perf_session *session); =20 void ui_browser__argv_seek(struct ui_browser *browser, off_t offset, int w= hence); unsigned int ui_browser__argv_refresh(struct ui_browser *browser); diff --git a/tools/perf/ui/browsers/header.c b/tools/perf/ui/browsers/heade= r.c index 2213b4661600..5b5ca32e3eef 100644 --- a/tools/perf/ui/browsers/header.c +++ b/tools/perf/ui/browsers/header.c @@ -93,16 +93,14 @@ static int ui__list_menu(int argc, char * const argv[]) return list_menu__run(&menu); } =20 -int tui__header_window(struct perf_env *env) +int tui__header_window(struct perf_session *session) { int i, argc =3D 0; char **argv; - struct perf_session *session; char *ptr, *pos; size_t size; FILE *fp =3D open_memstream(&ptr, &size); =20 - session =3D container_of(env, struct perf_session, header.env); perf_header__fprintf_info(session, fp, true); fclose(fp); =20 diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index d26b925e3d7f..d9d3fb44477a 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -3233,7 +3233,7 @@ static int evsel__hists_browse(struct evsel *evsel, i= nt nr_events, const char *h case 'i': /* env->arch is NULL for live-mode (i.e. perf top) */ if (env->arch) - tui__header_window(env); + tui__header_window(evsel__session(evsel)); continue; case 'F': symbol_conf.filter_relative ^=3D 1; diff --git a/tools/perf/util/amd-sample-raw.c b/tools/perf/util/amd-sample-= raw.c index 4b540e6fb42d..b084dee76b1a 100644 --- a/tools/perf/util/amd-sample-raw.c +++ b/tools/perf/util/amd-sample-raw.c @@ -354,7 +354,7 @@ static void parse_cpuid(struct perf_env *env) */ bool evlist__has_amd_ibs(struct evlist *evlist) { - struct perf_env *env =3D evlist->env; + struct perf_env *env =3D perf_session__env(evlist->session); int ret, nr_pmu_mappings =3D perf_env__nr_pmu_mappings(env); const char *pmu_mapping =3D perf_env__pmu_mappings(env); char name[sizeof("ibs_fetch")]; diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c index d46e0cccac99..8942fa598a84 100644 --- a/tools/perf/util/arm-spe.c +++ b/tools/perf/util/arm-spe.c @@ -856,7 +856,7 @@ static bool arm_spe__synth_ds(struct arm_spe_queue *spe= q, const char *cpuid; =20 pr_warning_once("Old SPE metadata, re-record to improve decode accuracy\= n"); - cpuid =3D perf_env__cpuid(spe->session->evlist->env); + cpuid =3D perf_env__cpuid(perf_session__env(spe->session)); midr =3D strtol(cpuid, NULL, 16); } else { /* CPU ID is -1 for per-thread mode */ diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index fac1a01ba13f..35c678e5beac 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -71,7 +71,7 @@ struct evlist { struct mmap *overwrite_mmap; struct evsel *selected; struct events_stats stats; - struct perf_env *env; + struct perf_session *session; void (*trace_event_sample_raw)(struct evlist *evlist, union perf_event *event, struct perf_sample *sample); diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 3896a04d90af..19d9d6d6a4b2 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -48,6 +48,7 @@ #include "record.h" #include "debug.h" #include "trace-event.h" +#include "session.h" #include "stat.h" #include "string2.h" #include "memswap.h" @@ -3859,11 +3860,16 @@ int evsel__open_strerror(struct evsel *evsel, struc= t target *target, err, str_error_r(err, sbuf, sizeof(sbuf)), evsel__name(evsel)); } =20 +struct perf_session *evsel__session(struct evsel *evsel) +{ + return evsel && evsel->evlist ? evsel->evlist->session : NULL; +} + struct perf_env *evsel__env(struct evsel *evsel) { - if (evsel && evsel->evlist && evsel->evlist->env) - return evsel->evlist->env; - return &perf_env; + struct perf_session *session =3D evsel__session(evsel); + + return session ? perf_session__env(session) : &perf_env; } =20 static int store_evsel_ids(struct evsel *evsel, struct evlist *evlist) diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index b84ee274602d..a2ac6e510d3b 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -539,6 +539,7 @@ static inline bool evsel__is_dummy_event(struct evsel *= evsel) (evsel->core.attr.config =3D=3D PERF_COUNT_SW_DUMMY); } =20 +struct perf_session *evsel__session(struct evsel *evsel); struct perf_env *evsel__env(struct evsel *evsel); =20 int evsel__store_ids(struct evsel *evsel, struct evlist *evlist); diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 2aba0d829c9e..dcef7f815fa1 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -4225,7 +4225,7 @@ int perf_session__read_header(struct perf_session *se= ssion) if (session->evlist =3D=3D NULL) return -ENOMEM; =20 - session->evlist->env =3D &header->env; + session->evlist->session =3D session; session->machines.host.env =3D &header->env; =20 /* diff --git a/tools/perf/util/s390-cpumsf.c b/tools/perf/util/s390-cpumsf.c index 0ce52f0280b8..c17dbe232c54 100644 --- a/tools/perf/util/s390-cpumsf.c +++ b/tools/perf/util/s390-cpumsf.c @@ -1142,7 +1142,7 @@ int s390_cpumsf_process_auxtrace_info(union perf_even= t *event, sf->machine =3D &session->machines.host; /* No kvm support */ sf->auxtrace_type =3D auxtrace_info->type; sf->pmu_type =3D PERF_TYPE_RAW; - sf->machine_type =3D s390_cpumsf_get_type(session->evlist->env->cpuid); + sf->machine_type =3D s390_cpumsf_get_type(perf_session__env(session)->cpu= id); =20 sf->auxtrace.process_event =3D s390_cpumsf_process_event; sf->auxtrace.process_auxtrace_event =3D s390_cpumsf_process_auxtrace_even= t; diff --git a/tools/perf/util/sample-raw.c b/tools/perf/util/sample-raw.c index f3f6bd9d290e..bcf442574d6e 100644 --- a/tools/perf/util/sample-raw.c +++ b/tools/perf/util/sample-raw.c @@ -6,15 +6,16 @@ #include "env.h" #include "header.h" #include "sample-raw.h" +#include "session.h" =20 /* * Check platform the perf data file was created on and perform platform * specific interpretation. */ -void evlist__init_trace_event_sample_raw(struct evlist *evlist) +void evlist__init_trace_event_sample_raw(struct evlist *evlist, struct per= f_env *env) { - const char *arch_pf =3D perf_env__arch(evlist->env); - const char *cpuid =3D perf_env__cpuid(evlist->env); + const char *arch_pf =3D perf_env__arch(env); + const char *cpuid =3D perf_env__cpuid(env); =20 if (arch_pf && !strcmp("s390", arch_pf)) evlist->trace_event_sample_raw =3D evlist__s390_sample_raw; diff --git a/tools/perf/util/sample-raw.h b/tools/perf/util/sample-raw.h index ea01c5811503..896e9a87e373 100644 --- a/tools/perf/util/sample-raw.h +++ b/tools/perf/util/sample-raw.h @@ -11,5 +11,5 @@ void evlist__s390_sample_raw(struct evlist *evlist, union= perf_event *event, bool evlist__has_amd_ibs(struct evlist *evlist); void evlist__amd_sample_raw(struct evlist *evlist, union perf_event *event, struct perf_sample *sample); -void evlist__init_trace_event_sample_raw(struct evlist *evlist); +void evlist__init_trace_event_sample_raw(struct evlist *evlist, struct per= f_env *env); #endif /* __PERF_EVLIST_H */ diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index b09d157f7d04..a851d9130abd 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -177,7 +177,7 @@ struct perf_session *__perf_session__new(struct perf_da= ta *data, perf_session__set_comm_exec(session); } =20 - evlist__init_trace_event_sample_raw(session->evlist); + evlist__init_trace_event_sample_raw(session->evlist, &session->header.e= nv); =20 /* Open the directory data. */ if (data->is_dir) { @@ -193,6 +193,8 @@ struct perf_session *__perf_session__new(struct perf_da= ta *data, } else { session->machines.host.env =3D &perf_env; } + if (session->evlist) + session->evlist->session =3D session; =20 session->machines.host.single_address_space =3D perf_env__single_address_space(session->machines.host.env); --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CD6262ED847 for ; Thu, 24 Jul 2025 16:33:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374824; cv=none; b=XfZZppyAZ7TwTTkO5qN4+g1crDR0af8bY1auSX8sve6/RM2GI6sav6kDKwHW5aQ8VeRDIUbjBTYYzukdFDN51yQ8wuZ2LELIaJAuOHAdEYkJUaNSjxcenJnVdPb11AZc8bQw/QW6ejkS4b8eSB644pilHxWI41NJx9htfgHhHLc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374824; c=relaxed/simple; bh=yGSh4X7XdoDwP/XNm5tByh8EInjitmt1+/yS78PRG70=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Kuv+YVasOnNjhcHPZa6WJWRM8siq6ttYwFyMig2KF45h2U48rQkpB+fBgH2eM8qJwO6adb8GfhdCMkejEXTrGu1oK1ryHDN5k860DDOUgOWCI8iDz7vZjrxdu3qrz6z44YShPeNwuSgZo9WGXsY0osdDlFeTVMDHRlc/bJi5ixU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=F+zXjG31; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="F+zXjG31" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b2fa1a84566so1044144a12.1 for ; Thu, 24 Jul 2025 09:33:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374822; x=1753979622; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=vPNCzyxfy4XXIcb2fDEErvAFWE2sdBLPvOrMGYrTagM=; b=F+zXjG31yUpQKiXTjZkv+DarH17nI7r6/u8kmLf/aChqGphth266qt85+dUTSEmFXz 5jPTIom/IZar9uYQJ7k+Okn0J60E8XpDguvxIxY+J+dzEg9foQcNk0zGNzZT0Jtipy6e QlNwcG0gO/ZYdDHYNQEooqb675WeYEb8706Scr0O8XUjJSMK3bpDkXSO02iqko7sstHP u8suCHOWSGlD2A3zngw2hZlWo6pVUmSvolpUNUv4I48z5Q9JmKWcRNlPKy0oh2veDLwR ycYIl+bA2rZGvHq/3Z8nWDdQkw5IyFlpTusN+5ffoxCaGBWlv44sDjv/Sq4fzcInNgCR TOXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374822; x=1753979622; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vPNCzyxfy4XXIcb2fDEErvAFWE2sdBLPvOrMGYrTagM=; b=LKYpbPw47Yu4YzKVNNlKCm7VzZtx5WkeyvdPfgEKBeFxlUqNftj4pdGhewWKXIPsKz VIEAP3eiyfyP1sLgdB4hPkLMDLF/KseqYq+Gy4HOzJ8bMI97eXeXAjOwWnRbDhIt3vOB MhD9uhYXE73Cbz5RgZp1OjAmD7lwByx+ZQO7GCqAtFL2Zd5CRGKeiur7D7yBiE2i4cs5 Ivssm7bajijzuWu4sihOYYbuJ+ujtP4FvrEhJCHK0ZCpwUG6Cgb9ThqYiaeLdMKMzn3+ sxHlEOGtnf1kNzgKyIj3rAmCzbgT1h2eOSxTRYBHjjA5+S4XLgKktVVSOZXTWMxAe9FE EVcQ== X-Forwarded-Encrypted: i=1; AJvYcCWInC/Px5qEtHP4FGl+ss11wmnfU0yHnqsXf5rijwsHpcaRhdYYeRzdNSp27Pg2ab8bN9eg4SHahG6bPpM=@vger.kernel.org X-Gm-Message-State: AOJu0YxASDtCeNSNVDEuPbV3JJWwAdKqvCzWk43XYO7NOPWJYO0VgJq7 c4uk5gTxHUXdYL/i4ug7JCBdFr3V1/KJ7qu0dmeWyqOuE8YP2WF7V50ae0UHbYirdtlOzDbe1zM ni+UIE7rbng== X-Google-Smtp-Source: AGHT+IFWT6BOL+6aTxUcrq+uPDzVJYv31JbUGlhLrN873B2nul9RqKGgG9i36nst6mAyrhy7TnmoJaqt5YdK X-Received: from pjyr5.prod.google.com ([2002:a17:90a:e185:b0:31c:2fe4:33be]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:46ce:b0:234:c5c1:9b7a with SMTP id d9443c01a7336-23f9816414dmr86102115ad.8.1753374822125; Thu, 24 Jul 2025 09:33:42 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:51 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-12-irogers@google.com> Subject: [PATCH v6 11/22] perf header: Clean up use of perf_env From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Always use the perf_env from the feat_fd's perf_header. Cache the value on entry to a function in `env` and use `env->` consistently in the code. Ensure the header is initialized for use in perf_session__do_write_header. Signed-off-by: Ian Rogers --- tools/perf/util/header.c | 174 ++++++++++++++++++++++----------------- 1 file changed, 98 insertions(+), 76 deletions(-) diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index dcef7f815fa1..b493399f9fc6 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -557,6 +557,7 @@ static int write_event_desc(struct feat_fd *ff, static int write_cmdline(struct feat_fd *ff, struct evlist *evlist __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; char pbuf[MAXPATHLEN], *buf; int i, ret, n; =20 @@ -564,7 +565,7 @@ static int write_cmdline(struct feat_fd *ff, buf =3D perf_exe(pbuf, MAXPATHLEN); =20 /* account for binary path */ - n =3D perf_env.nr_cmdline + 1; + n =3D env->nr_cmdline + 1; =20 ret =3D do_write(ff, &n, sizeof(n)); if (ret < 0) @@ -574,8 +575,8 @@ static int write_cmdline(struct feat_fd *ff, if (ret < 0) return ret; =20 - for (i =3D 0 ; i < perf_env.nr_cmdline; i++) { - ret =3D do_write_string(ff, perf_env.cmdline_argv[i]); + for (i =3D 0 ; i < env->nr_cmdline; i++) { + ret =3D do_write_string(ff, env->cmdline_argv[i]); if (ret < 0) return ret; } @@ -586,6 +587,7 @@ static int write_cmdline(struct feat_fd *ff, static int write_cpu_topology(struct feat_fd *ff, struct evlist *evlist __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; struct cpu_topology *tp; u32 i; int ret, j; @@ -613,17 +615,17 @@ static int write_cpu_topology(struct feat_fd *ff, break; } =20 - ret =3D perf_env__read_cpu_topology_map(&perf_env); + ret =3D perf_env__read_cpu_topology_map(env); if (ret < 0) goto done; =20 - for (j =3D 0; j < perf_env.nr_cpus_avail; j++) { - ret =3D do_write(ff, &perf_env.cpu[j].core_id, - sizeof(perf_env.cpu[j].core_id)); + for (j =3D 0; j < env->nr_cpus_avail; j++) { + ret =3D do_write(ff, &env->cpu[j].core_id, + sizeof(env->cpu[j].core_id)); if (ret < 0) return ret; - ret =3D do_write(ff, &perf_env.cpu[j].socket_id, - sizeof(perf_env.cpu[j].socket_id)); + ret =3D do_write(ff, &env->cpu[j].socket_id, + sizeof(env->cpu[j].socket_id)); if (ret < 0) return ret; } @@ -641,9 +643,9 @@ static int write_cpu_topology(struct feat_fd *ff, goto done; } =20 - for (j =3D 0; j < perf_env.nr_cpus_avail; j++) { - ret =3D do_write(ff, &perf_env.cpu[j].die_id, - sizeof(perf_env.cpu[j].die_id)); + for (j =3D 0; j < env->nr_cpus_avail; j++) { + ret =3D do_write(ff, &env->cpu[j].die_id, + sizeof(env->cpu[j].die_id)); if (ret < 0) return ret; } @@ -2123,17 +2125,18 @@ static void print_cpu_pmu_caps(struct feat_fd *ff, = FILE *fp) =20 static void print_pmu_caps(struct feat_fd *ff, FILE *fp) { + struct perf_env *env =3D &ff->ph->env; struct pmu_caps *pmu_caps; =20 - for (int i =3D 0; i < ff->ph->env.nr_pmus_with_caps; i++) { - pmu_caps =3D &ff->ph->env.pmu_caps[i]; + for (int i =3D 0; i < env->nr_pmus_with_caps; i++) { + pmu_caps =3D &env->pmu_caps[i]; __print_pmu_caps(fp, pmu_caps->nr_caps, pmu_caps->caps, pmu_caps->pmu_name); } =20 - if (strcmp(perf_env__arch(&ff->ph->env), "x86") =3D=3D 0 && - perf_env__has_pmu_mapping(&ff->ph->env, "ibs_op")) { - char *max_precise =3D perf_env__find_pmu_cap(&ff->ph->env, "cpu", "max_p= recise"); + if (strcmp(perf_env__arch(env), "x86") =3D=3D 0 && + perf_env__has_pmu_mapping(env, "ibs_op")) { + char *max_precise =3D perf_env__find_pmu_cap(env, "cpu", "max_precise"); =20 if (max_precise !=3D NULL && atoi(max_precise) =3D=3D 0) fprintf(fp, "# AMD systems uses ibs_op// PMU for some precise events, e= .g.: cycles:p, see the 'perf list' man page for further details.\n"); @@ -2142,18 +2145,19 @@ static void print_pmu_caps(struct feat_fd *ff, FILE= *fp) =20 static void print_pmu_mappings(struct feat_fd *ff, FILE *fp) { + struct perf_env *env =3D &ff->ph->env; const char *delimiter =3D "# pmu mappings: "; char *str, *tmp; u32 pmu_num; u32 type; =20 - pmu_num =3D ff->ph->env.nr_pmu_mappings; + pmu_num =3D env->nr_pmu_mappings; if (!pmu_num) { fprintf(fp, "# pmu mappings: not available\n"); return; } =20 - str =3D ff->ph->env.pmu_mappings; + str =3D env->pmu_mappings; =20 while (pmu_num) { type =3D strtoul(str, &tmp, 0); @@ -2235,17 +2239,18 @@ static void memory_node__fprintf(struct memory_node= *n, =20 static void print_mem_topology(struct feat_fd *ff, FILE *fp) { + struct perf_env *env =3D &ff->ph->env; struct memory_node *nodes; int i, nr; =20 - nodes =3D ff->ph->env.memory_nodes; - nr =3D ff->ph->env.nr_memory_nodes; + nodes =3D env->memory_nodes; + nr =3D env->nr_memory_nodes; =20 fprintf(fp, "# memory nodes (nr %d, block size 0x%llx):\n", - nr, ff->ph->env.memory_bsize); + nr, env->memory_bsize); =20 for (i =3D 0; i < nr; i++) { - memory_node__fprintf(&nodes[i], ff->ph->env.memory_bsize, fp); + memory_node__fprintf(&nodes[i], env->memory_bsize, fp); } } =20 @@ -2443,6 +2448,7 @@ static int process_build_id(struct feat_fd *ff, void = *data __maybe_unused) =20 static int process_nrcpus(struct feat_fd *ff, void *data __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; int ret; u32 nr_cpus_avail, nr_cpus_online; =20 @@ -2453,20 +2459,21 @@ static int process_nrcpus(struct feat_fd *ff, void = *data __maybe_unused) ret =3D do_read_u32(ff, &nr_cpus_online); if (ret) return ret; - ff->ph->env.nr_cpus_avail =3D (int)nr_cpus_avail; - ff->ph->env.nr_cpus_online =3D (int)nr_cpus_online; + env->nr_cpus_avail =3D (int)nr_cpus_avail; + env->nr_cpus_online =3D (int)nr_cpus_online; return 0; } =20 static int process_total_mem(struct feat_fd *ff, void *data __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; u64 total_mem; int ret; =20 ret =3D do_read_u64(ff, &total_mem); if (ret) return -1; - ff->ph->env.total_mem =3D (unsigned long long)total_mem; + env->total_mem =3D (unsigned long long)total_mem; return 0; } =20 @@ -2527,13 +2534,14 @@ process_event_desc(struct feat_fd *ff, void *data _= _maybe_unused) =20 static int process_cmdline(struct feat_fd *ff, void *data __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; char *str, *cmdline =3D NULL, **argv =3D NULL; u32 nr, i, len =3D 0; =20 if (do_read_u32(ff, &nr)) return -1; =20 - ff->ph->env.nr_cmdline =3D nr; + env->nr_cmdline =3D nr; =20 cmdline =3D zalloc(ff->size + nr + 1); if (!cmdline) @@ -2553,8 +2561,8 @@ static int process_cmdline(struct feat_fd *ff, void *= data __maybe_unused) len +=3D strlen(str) + 1; free(str); } - ff->ph->env.cmdline =3D cmdline; - ff->ph->env.cmdline_argv =3D (const char **) argv; + env->cmdline =3D cmdline; + env->cmdline_argv =3D (const char **) argv; return 0; =20 error: @@ -2568,18 +2576,18 @@ static int process_cpu_topology(struct feat_fd *ff,= void *data __maybe_unused) u32 nr, i; char *str =3D NULL; struct strbuf sb; - int cpu_nr =3D ff->ph->env.nr_cpus_avail; + struct perf_env *env =3D &ff->ph->env; + int cpu_nr =3D env->nr_cpus_avail; u64 size =3D 0; - struct perf_header *ph =3D ff->ph; =20 - ph->env.cpu =3D calloc(cpu_nr, sizeof(*ph->env.cpu)); - if (!ph->env.cpu) + env->cpu =3D calloc(cpu_nr, sizeof(*env->cpu)); + if (!env->cpu) return -1; =20 if (do_read_u32(ff, &nr)) goto free_cpu; =20 - ph->env.nr_sibling_cores =3D nr; + env->nr_sibling_cores =3D nr; size +=3D sizeof(u32); if (strbuf_init(&sb, 128) < 0) goto free_cpu; @@ -2595,12 +2603,12 @@ static int process_cpu_topology(struct feat_fd *ff,= void *data __maybe_unused) size +=3D string_size(str); zfree(&str); } - ph->env.sibling_cores =3D strbuf_detach(&sb, NULL); + env->sibling_cores =3D strbuf_detach(&sb, NULL); =20 if (do_read_u32(ff, &nr)) return -1; =20 - ph->env.nr_sibling_threads =3D nr; + env->nr_sibling_threads =3D nr; size +=3D sizeof(u32); =20 for (i =3D 0; i < nr; i++) { @@ -2614,14 +2622,14 @@ static int process_cpu_topology(struct feat_fd *ff,= void *data __maybe_unused) size +=3D string_size(str); zfree(&str); } - ph->env.sibling_threads =3D strbuf_detach(&sb, NULL); + env->sibling_threads =3D strbuf_detach(&sb, NULL); =20 /* * The header may be from old perf, * which doesn't include core id and socket id information. */ if (ff->size <=3D size) { - zfree(&ph->env.cpu); + zfree(&env->cpu); return 0; } =20 @@ -2629,13 +2637,13 @@ static int process_cpu_topology(struct feat_fd *ff,= void *data __maybe_unused) if (do_read_u32(ff, &nr)) goto free_cpu; =20 - ph->env.cpu[i].core_id =3D nr; + env->cpu[i].core_id =3D nr; size +=3D sizeof(u32); =20 if (do_read_u32(ff, &nr)) goto free_cpu; =20 - ph->env.cpu[i].socket_id =3D nr; + env->cpu[i].socket_id =3D nr; size +=3D sizeof(u32); } =20 @@ -2649,7 +2657,7 @@ static int process_cpu_topology(struct feat_fd *ff, v= oid *data __maybe_unused) if (do_read_u32(ff, &nr)) return -1; =20 - ph->env.nr_sibling_dies =3D nr; + env->nr_sibling_dies =3D nr; size +=3D sizeof(u32); =20 for (i =3D 0; i < nr; i++) { @@ -2663,13 +2671,13 @@ static int process_cpu_topology(struct feat_fd *ff,= void *data __maybe_unused) size +=3D string_size(str); zfree(&str); } - ph->env.sibling_dies =3D strbuf_detach(&sb, NULL); + env->sibling_dies =3D strbuf_detach(&sb, NULL); =20 for (i =3D 0; i < (u32)cpu_nr; i++) { if (do_read_u32(ff, &nr)) goto free_cpu; =20 - ph->env.cpu[i].die_id =3D nr; + env->cpu[i].die_id =3D nr; } =20 return 0; @@ -2678,12 +2686,13 @@ static int process_cpu_topology(struct feat_fd *ff,= void *data __maybe_unused) strbuf_release(&sb); zfree(&str); free_cpu: - zfree(&ph->env.cpu); + zfree(&env->cpu); return -1; } =20 static int process_numa_topology(struct feat_fd *ff, void *data __maybe_un= used) { + struct perf_env *env =3D &ff->ph->env; struct numa_node *nodes, *n; u32 nr, i; char *str; @@ -2718,8 +2727,8 @@ static int process_numa_topology(struct feat_fd *ff, = void *data __maybe_unused) if (!n->map) goto error; } - ff->ph->env.nr_numa_nodes =3D nr; - ff->ph->env.numa_nodes =3D nodes; + env->nr_numa_nodes =3D nr; + env->numa_nodes =3D nodes; return 0; =20 error: @@ -2729,6 +2738,7 @@ static int process_numa_topology(struct feat_fd *ff, = void *data __maybe_unused) =20 static int process_pmu_mappings(struct feat_fd *ff, void *data __maybe_unu= sed) { + struct perf_env *env =3D &ff->ph->env; char *name; u32 pmu_num; u32 type; @@ -2742,7 +2752,7 @@ static int process_pmu_mappings(struct feat_fd *ff, v= oid *data __maybe_unused) return 0; } =20 - ff->ph->env.nr_pmu_mappings =3D pmu_num; + env->nr_pmu_mappings =3D pmu_num; if (strbuf_init(&sb, 128) < 0) return -1; =20 @@ -2761,14 +2771,14 @@ static int process_pmu_mappings(struct feat_fd *ff,= void *data __maybe_unused) goto error; =20 if (!strcmp(name, "msr")) - ff->ph->env.msr_pmu_type =3D type; + env->msr_pmu_type =3D type; =20 free(name); pmu_num--; } /* AMD may set it by evlist__has_amd_ibs() from perf_session__new() */ - free(ff->ph->env.pmu_mappings); - ff->ph->env.pmu_mappings =3D strbuf_detach(&sb, NULL); + free(env->pmu_mappings); + env->pmu_mappings =3D strbuf_detach(&sb, NULL); return 0; =20 error: @@ -2778,6 +2788,7 @@ static int process_pmu_mappings(struct feat_fd *ff, v= oid *data __maybe_unused) =20 static int process_group_desc(struct feat_fd *ff, void *data __maybe_unuse= d) { + struct perf_env *env =3D &ff->ph->env; size_t ret =3D -1; u32 i, nr, nr_groups; struct perf_session *session; @@ -2791,7 +2802,7 @@ static int process_group_desc(struct feat_fd *ff, voi= d *data __maybe_unused) if (do_read_u32(ff, &nr_groups)) return -1; =20 - ff->ph->env.nr_groups =3D nr_groups; + env->nr_groups =3D nr_groups; if (!nr_groups) { pr_debug("group desc not available\n"); return 0; @@ -2875,6 +2886,7 @@ static int process_auxtrace(struct feat_fd *ff, void = *data __maybe_unused) =20 static int process_cache(struct feat_fd *ff, void *data __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; struct cpu_cache_level *caches; u32 cnt, i, version; =20 @@ -2915,8 +2927,8 @@ static int process_cache(struct feat_fd *ff, void *da= ta __maybe_unused) #undef _R } =20 - ff->ph->env.caches =3D caches; - ff->ph->env.caches_cnt =3D cnt; + env->caches =3D caches; + env->caches_cnt =3D cnt; return 0; out_free_caches: for (i =3D 0; i < cnt; i++) { @@ -2952,6 +2964,7 @@ static int process_sample_time(struct feat_fd *ff, vo= id *data __maybe_unused) static int process_mem_topology(struct feat_fd *ff, void *data __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; struct memory_node *nodes; u64 version, i, nr, bsize; int ret =3D -1; @@ -2990,9 +3003,9 @@ static int process_mem_topology(struct feat_fd *ff, nodes[i] =3D n; } =20 - ff->ph->env.memory_bsize =3D bsize; - ff->ph->env.memory_nodes =3D nodes; - ff->ph->env.nr_memory_nodes =3D nr; + env->memory_bsize =3D bsize; + env->memory_nodes =3D nodes; + env->nr_memory_nodes =3D nr; ret =3D 0; =20 out: @@ -3004,7 +3017,9 @@ static int process_mem_topology(struct feat_fd *ff, static int process_clockid(struct feat_fd *ff, void *data __maybe_unused) { - if (do_read_u64(ff, &ff->ph->env.clock.clockid_res_ns)) + struct perf_env *env =3D &ff->ph->env; + + if (do_read_u64(ff, &env->clock.clockid_res_ns)) return -1; =20 return 0; @@ -3013,6 +3028,7 @@ static int process_clockid(struct feat_fd *ff, static int process_clock_data(struct feat_fd *ff, void *_data __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; u32 data32; u64 data64; =20 @@ -3027,26 +3043,27 @@ static int process_clock_data(struct feat_fd *ff, if (do_read_u32(ff, &data32)) return -1; =20 - ff->ph->env.clock.clockid =3D data32; + env->clock.clockid =3D data32; =20 /* TOD ref time */ if (do_read_u64(ff, &data64)) return -1; =20 - ff->ph->env.clock.tod_ns =3D data64; + env->clock.tod_ns =3D data64; =20 /* clockid ref time */ if (do_read_u64(ff, &data64)) return -1; =20 - ff->ph->env.clock.clockid_ns =3D data64; - ff->ph->env.clock.enabled =3D true; + env->clock.clockid_ns =3D data64; + env->clock.enabled =3D true; return 0; } =20 static int process_hybrid_topology(struct feat_fd *ff, void *data __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; struct hybrid_node *nodes, *n; u32 nr, i; =20 @@ -3070,8 +3087,8 @@ static int process_hybrid_topology(struct feat_fd *ff, goto error; } =20 - ff->ph->env.nr_hybrid_nodes =3D nr; - ff->ph->env.hybrid_nodes =3D nodes; + env->nr_hybrid_nodes =3D nr; + env->hybrid_nodes =3D nodes; return 0; =20 error: @@ -3224,19 +3241,21 @@ static int process_bpf_btf(struct feat_fd *ff, void= *data __maybe_unused) static int process_compressed(struct feat_fd *ff, void *data __maybe_unused) { - if (do_read_u32(ff, &(ff->ph->env.comp_ver))) + struct perf_env *env =3D &ff->ph->env; + + if (do_read_u32(ff, &(env->comp_ver))) return -1; =20 - if (do_read_u32(ff, &(ff->ph->env.comp_type))) + if (do_read_u32(ff, &(env->comp_type))) return -1; =20 - if (do_read_u32(ff, &(ff->ph->env.comp_level))) + if (do_read_u32(ff, &(env->comp_level))) return -1; =20 - if (do_read_u32(ff, &(ff->ph->env.comp_ratio))) + if (do_read_u32(ff, &(env->comp_ratio))) return -1; =20 - if (do_read_u32(ff, &(ff->ph->env.comp_mmap_len))) + if (do_read_u32(ff, &(env->comp_mmap_len))) return -1; =20 return 0; @@ -3308,19 +3327,21 @@ static int __process_pmu_caps(struct feat_fd *ff, i= nt *nr_caps, static int process_cpu_pmu_caps(struct feat_fd *ff, void *data __maybe_unused) { - int ret =3D __process_pmu_caps(ff, &ff->ph->env.nr_cpu_pmu_caps, - &ff->ph->env.cpu_pmu_caps, - &ff->ph->env.max_branches, - &ff->ph->env.br_cntr_nr, - &ff->ph->env.br_cntr_width); + struct perf_env *env =3D &ff->ph->env; + int ret =3D __process_pmu_caps(ff, &env->nr_cpu_pmu_caps, + &env->cpu_pmu_caps, + &env->max_branches, + &env->br_cntr_nr, + &env->br_cntr_width); =20 - if (!ret && !ff->ph->env.cpu_pmu_caps) + if (!ret && !env->cpu_pmu_caps) pr_debug("cpu pmu capabilities not available\n"); return ret; } =20 static int process_pmu_caps(struct feat_fd *ff, void *data __maybe_unused) { + struct perf_env *env =3D &ff->ph->env; struct pmu_caps *pmu_caps; u32 nr_pmu, i; int ret; @@ -3358,8 +3379,8 @@ static int process_pmu_caps(struct feat_fd *ff, void = *data __maybe_unused) } } =20 - ff->ph->env.nr_pmus_with_caps =3D nr_pmu; - ff->ph->env.pmu_caps =3D pmu_caps; + env->nr_pmus_with_caps =3D nr_pmu; + env->pmu_caps =3D pmu_caps; return 0; =20 err: @@ -3657,6 +3678,7 @@ static int perf_session__do_write_header(struct perf_= session *session, struct perf_header *header =3D &session->header; struct evsel *evsel; struct feat_fd ff =3D { + .ph =3D header, .fd =3D fd, }; u64 attr_offset =3D sizeof(f_header), attr_size =3D 0; --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A32E2ED861 for ; Thu, 24 Jul 2025 16:33:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374826; cv=none; b=KwVstRjkuCA/crpIzR6O9q/zE0Nw9+LNk3NmItBeQ+AOjDOI99zPgMTxplIaIqRYViPn76NLi/RdpT4kzI4a8jgduAlDTabRWF4adEkAZe5aTOwRnZXK5XAHXB8ZdxanUPOCeUPGIorMWYxkh0whx6KZIC3lG4Rxgg2XmR4RrVw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374826; c=relaxed/simple; bh=7nZIiiIn++uSLOhLUk9vUxm/WKkVS4OwTThT0yMdM0E=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=l1l2loZHBdxViVtEW6HIHIMHw8+qhreVIPgW2kwFWyeS3Iubv5VZ1YbRZ6uX+tNAIveKY+wumMAnuFLLxR3kaOy9XykWpaAI0Rme3roUGdTxYkj5x+NrUiH5AblHwrz4bcyuGxZV8zDCA0VxtJjCdvcUAJ4Z8EhsQfxmdboEt4Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=TpilkqaT; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="TpilkqaT" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-311d670ad35so1106270a91.3 for ; Thu, 24 Jul 2025 09:33:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374825; x=1753979625; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=j4ATCR3gS0GLP8ySUZk5tVezlk+x+k580IPZRgyjTI4=; b=TpilkqaTdbDDH09JCjiCEAC/Nq8x9xJjwblexJu2esFnjc4qGNRUcBq6yeTmg2goHA 3aC1xRq269Oai10uaoEioAMZgmUSqYcxb/Bp9oPPl71vQS972v1HW9fGx09uhIX1/yhF gQPu5ubOYOo9+CBAGKc2apJFHGjHpW9y3le0C9IJiCSFV9p/mJQ1Rb4UbZ4HTPD8a2iH /hEVCnjdyc1RAS3dglMkihLxqz1bd5CFdtz0OfzAuwd21mcsqoq30++5keCmNuYa7jaK yVTRYs4ZEa73oeLcHVbf6y//jEoym+hcfWbp+Z7/jnVsXGokZC4IQp/FWC7KNtdIS2Do LFtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374825; x=1753979625; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=j4ATCR3gS0GLP8ySUZk5tVezlk+x+k580IPZRgyjTI4=; b=hzr0gDwrJ8jhuqCuXsTNl4N6BRcxHRs8HhYe/LZtCVbozVp2j5CiNAfP2D+t5FkGYH keZyqIzxfrWjEE65w7QDDu9FgMK3gaQao0vJBfboQjd/Svz3Os6G1Kb9MUPbHl6EM7CR yV0wLAg6PylzK4rIk5Do4xymQOjXo6/V/2dwbyNWq8hg0p7rugjeCWO7tnTP6OVa4dwy Ci9XCSQNk4wpGen9VZl1ODYmsPcJygMDTK3+zSnzTY9a4mJUyPqm2c5Wu7gMY593zmae VMEUWV39vZ3b4VeYZH7jYkyG/rIOlL+3hpkg3agkEl101QgI1x08s0ua16WLwYyRdxTg XNCQ== X-Forwarded-Encrypted: i=1; AJvYcCV7goB9GtP3zbBUeXhKNxZxft0fTBkH85YkzFGp5+1P/NKlg/AAdc0HSgTklE8zHURID2JxiJMk/KKftZA=@vger.kernel.org X-Gm-Message-State: AOJu0YxtJMCM6x/hv4MoCwc3CV6H/Bi4SguXnoH+FnI2gVpDvn9g7PjC wJ+jSzOygc5+ldWmpVYOpUZ8bhnAmlbQowxKuPYw632HLQ9eu8ldsrtFPNuMZhrxNMN0fdCHMb4 wzKMvqk5SlA== X-Google-Smtp-Source: AGHT+IG9P+0/1FRepvIABmSkJ3cwZnJnUD4EaW9KMNoS8pG7zfn4lxon2/8z1BpHnrz4L3+dyy5Bk56cT/Y1 X-Received: from pjbsd5.prod.google.com ([2002:a17:90b:5145:b0:311:485b:d057]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:582e:b0:313:14b5:2538 with SMTP id 98e67ed59e1d1-31e50859d80mr9985080a91.35.1753374824262; Thu, 24 Jul 2025 09:33:44 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:52 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-13-irogers@google.com> Subject: [PATCH v6 12/22] perf test: Avoid use perf_env From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The perf_env global variable holds the host perf_env data but its use is hit and miss. Switch to using local perf_env variables and ensure scoped perf_env__init and perf_env__exit. This loses command line setting of the perf_env, but this doesn't matter for tests. So the perf_env is fully initialized, clear it with memset in perf_env__init. Signed-off-by: Ian Rogers --- tools/perf/tests/code-reading.c | 5 +++- tools/perf/tests/dlfilter-test.c | 50 ++++++++++++++++++-------------- tools/perf/util/env.c | 1 + 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-readin= g.c index 6efb6b4bbcce..0ec7004f90fe 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c @@ -651,11 +651,13 @@ static int do_test_code_reading(bool try_kcore) struct dso *dso; const char *events[] =3D { "cycles", "cycles:u", "cpu-clock", "cpu-clock:= u", NULL }; int evidx =3D 0; + struct perf_env host_env; =20 pid =3D getpid(); =20 machine =3D machine__new_host(); - machine->env =3D &perf_env; + perf_env__init(&host_env); + machine->env =3D &host_env; =20 ret =3D machine__create_kernel_maps(machine); if (ret < 0) { @@ -791,6 +793,7 @@ static int do_test_code_reading(bool try_kcore) perf_cpu_map__put(cpus); perf_thread_map__put(threads); machine__delete(machine); + perf_env__exit(&host_env); =20 return err; } diff --git a/tools/perf/tests/dlfilter-test.c b/tools/perf/tests/dlfilter-t= est.c index 54f59d1246bc..6427e3382711 100644 --- a/tools/perf/tests/dlfilter-test.c +++ b/tools/perf/tests/dlfilter-test.c @@ -319,11 +319,12 @@ static int run_perf_script(struct test_data *td) =20 static int test__dlfilter_test(struct test_data *td) { + struct perf_env host_env; u64 sample_type =3D TEST_SAMPLE_TYPE; pid_t pid =3D 12345; pid_t tid =3D 12346; u64 id =3D 99; - int err; + int err =3D TEST_OK; =20 if (get_dlfilters_path(td->name, td->dlfilters, PATH_MAX)) return test_result("dlfilters not found", TEST_SKIP); @@ -353,37 +354,42 @@ static int test__dlfilter_test(struct test_data *td) =20 pr_debug("Creating new host machine structure\n"); td->machine =3D machine__new_host(); - td->machine->env =3D &perf_env; + perf_env__init(&host_env); + td->machine->env =3D &host_env; =20 td->fd =3D creat(td->perf_data_file_name, 0644); if (td->fd < 0) return test_result("Failed to create test perf.data file", TEST_FAIL); =20 err =3D perf_header__write_pipe(td->fd); - if (err < 0) - return test_result("perf_header__write_pipe() failed", TEST_FAIL); - + if (err < 0) { + err =3D test_result("perf_header__write_pipe() failed", TEST_FAIL); + goto out; + } err =3D write_attr(td, sample_type, &id); - if (err) - return test_result("perf_event__synthesize_attr() failed", TEST_FAIL); - - if (write_comm(td->fd, pid, tid, "test-prog")) - return TEST_FAIL; - - if (write_mmap(td->fd, pid, tid, MAP_START, 0x10000, 0, td->prog_file_nam= e)) - return TEST_FAIL; - - if (write_sample(td, sample_type, id, pid, tid) !=3D TEST_OK) - return TEST_FAIL; - + if (err) { + err =3D test_result("perf_event__synthesize_attr() failed", TEST_FAIL); + goto out; + } + if (write_comm(td->fd, pid, tid, "test-prog")) { + err =3D TEST_FAIL; + goto out; + } + if (write_mmap(td->fd, pid, tid, MAP_START, 0x10000, 0, td->prog_file_nam= e)) { + err =3D TEST_FAIL; + goto out; + } + if (write_sample(td, sample_type, id, pid, tid) !=3D TEST_OK) { + err =3D TEST_FAIL; + goto out; + } if (verbose > 1) system_cmd("%s script -i %s -D", td->perf, td->perf_data_file_name); =20 - err =3D run_perf_script(td); - if (err) - return TEST_FAIL; - - return TEST_OK; + err =3D run_perf_script(td) ? TEST_FAIL : TEST_OK; +out: + perf_env__exit(&host_env); + return err; } =20 static void unlink_path(const char *path) diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c index ee51378fb0d9..c09159083bf0 100644 --- a/tools/perf/util/env.c +++ b/tools/perf/util/env.c @@ -271,6 +271,7 @@ void perf_env__exit(struct perf_env *env) =20 void perf_env__init(struct perf_env *env) { + memset(env, 0, sizeof(*env)); #ifdef HAVE_LIBBPF_SUPPORT env->bpf_progs.infos =3D RB_ROOT; env->bpf_progs.btfs =3D RB_ROOT; --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:10 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A53D92ED85E for ; Thu, 24 Jul 2025 16:33:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374829; cv=none; b=XaWzf46K7Nxzb6+fpgJ71oqYWtAa2nAJE9kpvihldOEtKqhxCSjhSOugMLrUfWp8dtJiomHUEn8hlB3lgkNoymKy04C15CEHmxKKgnziejcEBZqx+zibxJAPklEmIWm/3g2DBgUqWC/21iOGfGSc/b7DEg2icqnVd+T0f0g5Hpk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374829; c=relaxed/simple; bh=VhjuIJYpXg7gkvG80mgZExtZaW1Qk4lTD2dWqGrYHq8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=YUWfEZzc8QJ8r/5Q4NkqG0v4V9LGWqAdXdJYVWhCqvrbpWQ06ZRLgXJfDctRdAAgCHSPYIKSQt68h6FNEQAGiNm5YlQE2CTzEO+Eai53qzXustTL7NOUTHcrwcJq/e1ZQneQGTy4PjxQep2Rbc1pq84FBhsGzo8ID1lw7BomEKs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=DBodTOaD; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="DBodTOaD" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-236725af87fso17863825ad.3 for ; Thu, 24 Jul 2025 09:33:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374827; x=1753979627; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=b4/0/V1Jpkj3zmwIH+nXlPhlxtETIFRUrmbIcWZ+uZQ=; b=DBodTOaDObLDYTuFZfP7utl3W/0DEWLnxxjnwjXQoStUycwLfOuFXhQssCzBf/NNJw GM6076KIhS8g/X7hzMsqaqlELkTR0cA/U57kQBqr07M3VOv8gV5gKKcE67rY/d990GZU z3kFvRYyg3wTq5fsaEmAz8d0DIXvWjzYd0MVrVgxwGp5ODCc2cIlQbtzlQ101+WRNOzv igQHQq8AO9fI7Um98w1jRRnQS1KBtCu31VtNq8V+rA3ze5zqF3feRkSETT966DpEAT67 o3SghDBFN3EB7OJ08kwjyZfP+NHN7Lvlf2UAOhzHkyec2KSaKLhRV+6WZwDOhghlZqL5 SkxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374827; x=1753979627; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=b4/0/V1Jpkj3zmwIH+nXlPhlxtETIFRUrmbIcWZ+uZQ=; b=eTkUtUQLW4E5hZ4IHUgES4vKAqGUDaewU0W7KwfLvBRz4F6LLa76L9eHAhUeXMCcQ+ IkHxb+qJ0rN4+mB5e/DtZYhCX/13ydgvgkbx1RNIgq8mFKxmSCurcGmZksrOJug4X04S U56fzVfTKXOPjOeJw8wcVlDR1USaSg8RRZcPuoTzvbb8gOXKuLjR+QX0iUxYchmdVuAb 5VRvf608uaKbgBjHrtHIwr3T9Qumf7NjmQm3TdyjxsKlgqwr+o9TIf22QwP6m8L82c5v Ng6TfVc+kY1hV4pMD63/tkOpCmPKSNidNmpRUSQ6Bk9a+z742ySaIAW1xXFUO3TWQcZL r+ZA== X-Forwarded-Encrypted: i=1; AJvYcCUFE+W0wVfDpZB5qtZaksaOz6/U3YNF9Z2PBVaNKjSSnIZggc9L/K9+UedeBd92t2PnaKoBJacq+gptOiQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzYToGIxsflTI71zdvsCa6RGxYHIkLMIsWrSBIrxGtqenhCQG1A NX+pOdO8IpNnUYKgPApZrWV0UXH3r+DoTj0NYq5/2xuTjk+PLFCTP5NV53424B5S9NCJn50WJgV GU5BUxMmzjQ== X-Google-Smtp-Source: AGHT+IHFt9nlp05P3QADiTotBXyL/2/i91rG6fQdo5ZJe0teRp9VZIOuIeZUcNDn8bxRcWSr5Itsa2K1MY8D X-Received: from plbkr8.prod.google.com ([2002:a17:903:808:b0:234:bf8f:6965]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f688:b0:220:c164:6ee1 with SMTP id d9443c01a7336-23f981936cemr119242565ad.32.1753374826633; Thu, 24 Jul 2025 09:33:46 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:53 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-14-irogers@google.com> Subject: [PATCH v6 13/22] perf session: Add host_env argument to perf_session__new From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When creating a perf_session the host perf_env may or may not want to be used. For example, `perf top` uses a host perf_env while `perf inject` does not. Add a host_env argument to perf_session__new so that sessions requiring a host perf_env can pass it in. Currently if none is specified the global perf_env variable is used, but this will change in later patches. Signed-off-by: Ian Rogers --- tools/perf/builtin-inject.c | 3 ++- tools/perf/util/session.c | 5 +++-- tools/perf/util/session.h | 5 +++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index f73350a3417a..40ba6a94f719 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -2539,7 +2539,8 @@ int cmd_inject(int argc, const char **argv) inject.tool.bpf_metadata =3D perf_event__repipe_op2_synth; inject.tool.dont_split_sample_group =3D true; inject.session =3D __perf_session__new(&data, &inject.tool, - /*trace_event_repipe=3D*/inject.output.is_pipe); + /*trace_event_repipe=3D*/inject.output.is_pipe, + /*host_env=3D*/NULL); =20 if (IS_ERR(inject.session)) { ret =3D PTR_ERR(inject.session); diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index a851d9130abd..36532329a633 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -138,7 +138,8 @@ static int ordered_events__deliver_event(struct ordered= _events *oe, =20 struct perf_session *__perf_session__new(struct perf_data *data, struct perf_tool *tool, - bool trace_event_repipe) + bool trace_event_repipe, + struct perf_env *host_env) { int ret =3D -ENOMEM; struct perf_session *session =3D zalloc(sizeof(*session)); @@ -191,7 +192,7 @@ struct perf_session *__perf_session__new(struct perf_da= ta *data, symbol_conf.kallsyms_name =3D perf_data__kallsyms_name(data); } } else { - session->machines.host.env =3D &perf_env; + session->machines.host.env =3D host_env ?: &perf_env; } if (session->evlist) session->evlist->session =3D session; diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index e7f7464b838f..cf88d65a25cb 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -107,12 +107,13 @@ struct perf_tool; =20 struct perf_session *__perf_session__new(struct perf_data *data, struct perf_tool *tool, - bool trace_event_repipe); + bool trace_event_repipe, + struct perf_env *host_env); =20 static inline struct perf_session *perf_session__new(struct perf_data *dat= a, struct perf_tool *tool) { - return __perf_session__new(data, tool, /*trace_event_repipe=3D*/false); + return __perf_session__new(data, tool, /*trace_event_repipe=3D*/false, /*= host_env=3D*/NULL); } =20 void perf_session__delete(struct perf_session *session); --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:11 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ACBB32EB5AA for ; Thu, 24 Jul 2025 16:33:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374832; cv=none; b=RLyN2Ti2bfW6hHYJ+y/gJnb8xgVz/FWxPSTjcj951d4MBwRWTDQuOvMANapbx0CygM22s3ZVtrvriJJJsS+a0I4QYQEkRicrxLQ62a/V0NqSkt3qB4iMVv0NSkQUUJsuHhs2PMgilvYGVblHXghElssR1H6yWh/Stxj/KJXcHJY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374832; c=relaxed/simple; bh=M1y3Ccv5wcC/FlJvlmEgkQTMj66snv5y7BAiZnAjazI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=MEioVayeiaxoWExSN06nSEiZb02kZyjFtlOTK2gzYul22CWrXig+9ito5cpttLs5FgU72ZpaeR9592qZxdtbK4m76WEv4HcOfKynO+41tvnXUwNypva3ckxvsjmNXpNvwRskHCuPNclna2tG3m+cMMgiBPAaOXGg3jWvxfhSCkg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=0F9T4dHZ; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="0F9T4dHZ" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-75e28bcec3bso1924302b3a.1 for ; Thu, 24 Jul 2025 09:33:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374830; x=1753979630; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=wDeRluXdBwCYopmgtwRgx8UAXiSsbc3geNmQzma7A5A=; b=0F9T4dHZsFflH6udPW/DSz+QcpTcULRnKSex7OJUkEfEBZhBLdz5AoKlfcgb4NpH+n KWucWGPQ+mZHzkC/UyA7p1CwMRpT4twBTuE+vdzG+q0io/AaDC9rlrbKLKP+TIyOf3nA wPEelwLFkOCyAe/WwZy4thUwiGzMmDPhlY5yj7+YqFpOy1x3nMwxeTVvTWMrXrpGLFbX MXE1nawoEKLeSIvIsjPERjOyLCZAoxDGNtybujFOG1nbmhj9Tv1T5MUa0S2ryUpYnSbP c9ST6yf+54R5zX43hat6ReRgqGYu0Jso9zCnvUmJByefRkxSHhwy4VtvkcRYEkILxWkH i7Nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374830; x=1753979630; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=wDeRluXdBwCYopmgtwRgx8UAXiSsbc3geNmQzma7A5A=; b=n8BCKX5RY/Vj90muN61bghxxpiNzsYOv7nM7/4HohwV4+pdNj/If1fbzl7u7AuI7rS AoXQ1Bt5v3zrzDj/XIybcxThjapOUM+76cJSwnWU610vPURHk3R4Kq8XoI0hy74acfuQ QvjAQHqw6sOP7ZHBpHcpGbGOU0ZHBPT7KgALqNxy6Fq0ppKPjC/o84/EGRkN34lomJf7 VHSdLDn1ccodXoS+kX79tVmnaDgTYTThs2NqJGxW5q1eLgW4dcrjY08UGXCgu9Oiou7R c3Wqhuzd9jwyg9QtlH7+O8YNLAHSqHW7tfPrFUU+UKLwLImZ8fLfhlb3rgHZCw/IOqL+ 4ddg== X-Forwarded-Encrypted: i=1; AJvYcCV7kADlJcFbvBdLydViM7KX09L8nKZRRu7M1WGIamNkznlwYnkF16EBghvLXWWeohZqEWFap09xbl+uiZM=@vger.kernel.org X-Gm-Message-State: AOJu0YynCxWI7p5ul/pevcu5HJcYszttKVL5y3J4haPMzt3jDM+mtI+x dMXiHWhjXXPt2ik69OJsvlM6ex6B/Q+sEtuo3CfaT5RA6liUfviueGystpGBB0N4lhlXMhUrOx5 GIojgz5OXEA== X-Google-Smtp-Source: AGHT+IE5otf6xpjAUYQYmChzsncjQN9CdKwppi9ARvo8Df52CwrBGA3qyM9fysoiTGRSjVSItiZ7IO/2pR+I X-Received: from pfvf6.prod.google.com ([2002:a05:6a00:1ac6:b0:747:a8e8:603e]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:815:b0:740:9d7c:8f5c with SMTP id d2e1a72fcca58-760356fbf25mr10861518b3a.18.1753374829698; Thu, 24 Jul 2025 09:33:49 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:54 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-15-irogers@google.com> Subject: [PATCH v6 14/22] perf top: Make perf_env locally scoped From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The use of the global host perf_env variable is potentially inconsistent within the code. Switch perf top to using a locally scoped variable that is generally accessed through the session. Signed-off-by: Ian Rogers --- tools/perf/builtin-top.c | 41 +++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 2760971d4c97..e9743f17bd0c 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1301,7 +1301,7 @@ static int __cmd_top(struct perf_top *top) perf_set_multithreaded(); =20 if (perf_hpp_list.socket) { - ret =3D perf_env__read_cpu_topology_map(&perf_env); + ret =3D perf_env__read_cpu_topology_map(perf_session__env(top->session)); if (ret < 0) { char errbuf[BUFSIZ]; const char *err =3D str_error_r(-ret, errbuf, sizeof(errbuf)); @@ -1624,6 +1624,7 @@ int cmd_top(int argc, const char **argv) NULL }; int status =3D hists__init(); + struct perf_env host_env; =20 if (status < 0) return status; @@ -1637,14 +1638,19 @@ int cmd_top(int argc, const char **argv) if (top.evlist =3D=3D NULL) return -ENOMEM; =20 + perf_env__init(&host_env); status =3D perf_config(perf_top_config, &top); if (status) - return status; + goto out_delete_evlist; /* * Since the per arch annotation init routine may need the cpuid, read * it here, since we are not getting this from the perf.data header. */ - status =3D perf_env__read_cpuid(&perf_env); + status =3D perf_env__set_cmdline(&host_env, argc, argv); + if (status) + goto out_delete_evlist; + + status =3D perf_env__read_cpuid(&host_env); if (status) { /* * Some arches do not provide a get_cpuid(), so just use pr_debug, other= wise @@ -1661,18 +1667,24 @@ int cmd_top(int argc, const char **argv) =20 if (disassembler_style) { annotate_opts.disassembler_style =3D strdup(disassembler_style); - if (!annotate_opts.disassembler_style) - return -ENOMEM; + if (!annotate_opts.disassembler_style) { + status =3D -ENOMEM; + goto out_delete_evlist; + } } if (objdump_path) { annotate_opts.objdump_path =3D strdup(objdump_path); - if (!annotate_opts.objdump_path) - return -ENOMEM; + if (!annotate_opts.objdump_path) { + status =3D -ENOMEM; + goto out_delete_evlist; + } } if (addr2line_path) { symbol_conf.addr2line_path =3D strdup(addr2line_path); - if (!symbol_conf.addr2line_path) - return -ENOMEM; + if (!symbol_conf.addr2line_path) { + status =3D -ENOMEM; + goto out_delete_evlist; + } } =20 status =3D symbol__validate_sym_arguments(); @@ -1735,7 +1747,7 @@ int cmd_top(int argc, const char **argv) symbol_conf.show_branchflag_count =3D true; =20 if (opts->branch_stack) { - status =3D perf_env__read_core_pmu_caps(&perf_env); + status =3D perf_env__read_core_pmu_caps(&host_env); if (status) { pr_err("PMU capability data is not available\n"); goto out_delete_evlist; @@ -1829,14 +1841,16 @@ int cmd_top(int argc, const char **argv) perf_top__update_print_entries(&top); signal(SIGWINCH, winch_sig); } - top.session->env =3D &perf_env; =20 - top.session =3D perf_session__new(NULL, NULL); + top.session =3D __perf_session__new(/*data=3D*/NULL, /*tool=3D*/NULL, + /*trace_event_repipe=3D*/false, + &host_env); if (IS_ERR(top.session)) { status =3D PTR_ERR(top.session); top.session =3D NULL; goto out_delete_evlist; } + top.evlist->session =3D top.session; =20 if (!evlist__needs_bpf_sb_event(top.evlist)) top.record_opts.no_bpf_event =3D true; @@ -1851,7 +1865,7 @@ int cmd_top(int argc, const char **argv) goto out_delete_evlist; } =20 - if (evlist__add_bpf_sb_event(top.sb_evlist, &perf_env)) { + if (evlist__add_bpf_sb_event(top.sb_evlist, &host_env)) { pr_err("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n."); status =3D -EINVAL; goto out_delete_evlist; @@ -1873,6 +1887,7 @@ int cmd_top(int argc, const char **argv) evlist__delete(top.evlist); perf_session__delete(top.session); annotation_options__exit(); + perf_env__exit(&host_env); =20 return status; } --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:11 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9DAB52EE981 for ; Thu, 24 Jul 2025 16:33:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374834; cv=none; b=F0ipMHByrfU1pyA1rI3Oi9GGJ9dP65rYqZFbNw6GBCabZZjnvuOJ33YU6ldU3mzuyRaEKntPgNnKgbOjO6x0emYjDEmlJjcn4hdhLCI2JC7ygnmfCN+v1rdI/IvBpR4GYN5ckQkl2EdJ8yPIASkZ6QW1F89knaYVojhRm1brmpw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374834; c=relaxed/simple; bh=f7Cr96NR+m4Torc47Lz6ejudcvRm2aLJBuMaEPZby/8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=GklvoPLUBNDbyLx4ZFGtraUcRWI5uMAjXECdCXi2fzKDBNChjrqxIDPZptAu9KxG9lq/G8rRRkgX6hmwIGbPWZQtcqCPaNqjySk1/2EiZFJWAxEepPaSQUzlTHyruURjMQIyeEXyf7sTQsylHmJ6ubgPD1JlGvoldlb7icB6Tng= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Y7nKQ4ET; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Y7nKQ4ET" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2349fe994a9so9709665ad.1 for ; Thu, 24 Jul 2025 09:33:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374832; x=1753979632; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=ura5wcTj4QWPpkbDlo4EPw9VccDPgu2z7OWMW7MfOzQ=; b=Y7nKQ4ETf0uza2fHSGYhzu4ZleH8MtNH/7hMdDOVohjDoeBII6x5P2r7A3dYxG03l8 K/6Z12FMrbcE9BnVPYabFLJHNvdBFg+u0WB+VApT6Il8+zaVitqwNIhK26m22WScd8Bz TgStLEZVD2j0lg0PmIYdI/GNxqKxIo6c52CcAguDCULbl3ys0sTqZaYV8Ecs+wwd6XbZ j5OoGXBmJfbAQugdcb+UF66koBUFZ2BvDTHXuI2mu/AAukRDLOS9vDVPshlfq1L0+/Jo P0Z/xotxX9P2OVcmQrUlk3i5gVEcelQWq8igbVsCc/reWc4Xv477u/+Vqn1nDcUgGgb0 1sgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374832; x=1753979632; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ura5wcTj4QWPpkbDlo4EPw9VccDPgu2z7OWMW7MfOzQ=; b=cfFXySmVemiKKl1D6ihMkOFF5ZYlJm+v8eS/Zsaze8VboKifOhU54N01RhJUukXF+J flO9jez7qN4bQPEVFN7VhwU569nEVVKcSwWxHxUxCSAM0PMC/4DkX1zrjlB9qF5nILEY eAa25xubtyDCm+cU5IOSOaoHccg05FNPTEHaLrtMPWhF83QD3HGPdt5qbZaOmI4jAF7v xillo/aXoJzL6AlPusRpXHGDvBvAtqn7Jsxl/eglmeQa378mpQbeJe3jWpc0SBc9vHu0 TMVTK8GKmGn/PckCOQjq250yWw2DUnaUbFM7MX2Tlb8hqDtDYOq+UiydObE3iij/dtZS HnIg== X-Forwarded-Encrypted: i=1; AJvYcCXpwTDiD2lUgXco6UeVsWl/YWIxUpVdXrQIZTuW3JCBPN4vAqVd5RBw+59V52DZStWTOnWrqfjpsjPlxco=@vger.kernel.org X-Gm-Message-State: AOJu0YxpztiPsBHgbnuPkQ2oK2ZvPYkGaQTCKM7J1Y5rvxuuPeZ39Jzz 3riTlNACNUZG9d+kdc16A4LzcjKEmdNwpO0eLIRVvs4isvxGHdVwwshRs4qTQY7B5Rf9O9RDh1b af249OhIyUw== X-Google-Smtp-Source: AGHT+IHpJd6vabYrSSti1Ja3w2Nm1/rMVDMaLq5NhuCPyXaWwsOvdwEXKWZ70ntOL4K2e/f5gEFFDX3xUsOO X-Received: from plbmn7.prod.google.com ([2002:a17:903:a47:b0:234:c5eb:fe1d]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:906:b0:235:779:edfd with SMTP id d9443c01a7336-23f981cd5cfmr103606605ad.39.1753374831951; Thu, 24 Jul 2025 09:33:51 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:55 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-16-irogers@google.com> Subject: [PATCH v6 15/22] perf bench synthesize: Avoid use of global perf_env From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The benchmark doesn't use a data file and so the header perf_env isn't used. Stack allocate a host perf_env for use to avoid the use of the global perf_env. Signed-off-by: Ian Rogers --- tools/perf/bench/synthesize.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/tools/perf/bench/synthesize.c b/tools/perf/bench/synthesize.c index 9b333276cbdb..b3d493697675 100644 --- a/tools/perf/bench/synthesize.c +++ b/tools/perf/bench/synthesize.c @@ -114,12 +114,16 @@ static int run_single_threaded(void) .pid =3D "self", }; struct perf_thread_map *threads; + struct perf_env host_env; int err; =20 perf_set_singlethreaded(); - session =3D perf_session__new(NULL, NULL); + perf_env__init(&host_env); + session =3D __perf_session__new(/*data=3D*/NULL, /*tool=3D*/NULL, + /*trace_event_repipe=3D*/false, &host_env); if (IS_ERR(session)) { pr_err("Session creation failed.\n"); + perf_env__exit(&host_env); return PTR_ERR(session); } threads =3D thread_map__new_by_pid(getpid()); @@ -144,6 +148,7 @@ static int run_single_threaded(void) perf_thread_map__put(threads); =20 perf_session__delete(session); + perf_env__exit(&host_env); return err; } =20 @@ -154,17 +159,21 @@ static int do_run_multi_threaded(struct target *targe= t, u64 runtime_us; unsigned int i; double time_average, time_stddev, event_average, event_stddev; - int err; + int err =3D 0; struct stats time_stats, event_stats; struct perf_session *session; + struct perf_env host_env; =20 + perf_env__init(&host_env); init_stats(&time_stats); init_stats(&event_stats); for (i =3D 0; i < multi_iterations; i++) { - session =3D perf_session__new(NULL, NULL); - if (IS_ERR(session)) - return PTR_ERR(session); - + session =3D __perf_session__new(/*data=3D*/NULL, /*tool=3D*/NULL, + /*trace_event_repipe=3D*/false, &host_env); + if (IS_ERR(session)) { + err =3D PTR_ERR(session); + goto err_out; + } atomic_set(&event_count, 0); gettimeofday(&start, NULL); err =3D __machine__synthesize_threads(&session->machines.host, @@ -175,7 +184,7 @@ static int do_run_multi_threaded(struct target *target, nr_threads_synthesize); if (err) { perf_session__delete(session); - return err; + goto err_out; } =20 gettimeofday(&end, NULL); @@ -198,7 +207,9 @@ static int do_run_multi_threaded(struct target *target, =20 printf(" Average time per event %.3f usec\n", time_average / event_average); - return 0; +err_out: + perf_env__exit(&host_env); + return err; } =20 static int run_multi_threaded(void) --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:11 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B89B32EF2AC for ; Thu, 24 Jul 2025 16:33:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374838; cv=none; b=MJEgSIlaL6E0pO5OvHhg/brH4EC8FOrMZhkm8VVB9VHqF+UrwSyOd1xgyMw5Ci9zlkeEotKz5IyN6M3iuVxxTSoDb6+jJDB6WKbxFhNpnMZTu4dZ3mUgrBT7zOsyUs0WBChSf7iqNwA2WrG9Yg1MCydJ476tuKD/uwv9hSNumV0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374838; c=relaxed/simple; bh=gpSlR0ht3SUqBmpJ17/QyzKwFWFkf2MsIuwkYslnOC8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=bYV7HazGGZtxCEHDLGms4+KUUk2dO7Tw6R514UhpXdgSKptaW3ILe7DzXeLPdsmzQbvmAaoCBpCbJqATaZMZycgNJ5D5Vh2aci4ENW/L+PfQwO5K//3feBm+WW6vXvpNrn2SREL9hNYNig+yNXx1wNUcDMjNMtSuOyLzRDEwHMo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=enQwic+J; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="enQwic+J" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-23638e1605dso8990505ad.0 for ; Thu, 24 Jul 2025 09:33:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374836; x=1753979636; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=TvIgDx3hdm9MFGvj7TyBUyq2eXQ45SEy4Oqh3QlaoGU=; b=enQwic+J9xlLuWTBfurZI8g2tCncoCCLa7gJg3UGPD9MKeZh+QyGNA52qEuy5Cw+oz cFXtQpb+kgX1bXpPvTSPgMd0lFhkne+9tiJPJACGKUe6qVqKsr+gauiWvJ9aF9HggiU+ WDRtNVMAd4ixiuzpgmX8f1pj6dBbHLyypbk+P3Ka384ej3VON6CY5yT5Kh8bhsOZucoq PeGNv3SWgtfl483x9KvaSaU6N0QPIn9hkglihzT8KelLNaapSaYiT6TtvtTj+ThOlVtB fNRkgKoRChuLHfZ/ITu2TjKN1r3dvvGS27QjEHfe/bgyQMVFNO1edSShOCfym0gp3xK7 8VtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374836; x=1753979636; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=TvIgDx3hdm9MFGvj7TyBUyq2eXQ45SEy4Oqh3QlaoGU=; b=cUPfjJ6NzejMMt5bZJoJkVQT3QEqZHtvnzLdeiRTcK5Q6+MD+PUZvD7thuuZpHslUA WiE+aRlsPYmOe7ziebSvuz0GWpyMd1ARYVV4r6GEUrFfUfRbW3N7u0pJYfWbFDkIP52k unnRAPHXgOWpFbxJ2nER2uyXm7+9Xo2+lMov9Pgbf5oUPnrO8XBigBpDaml5vBAExoYj wImR8n7GSjFu8jVA1IO9KcyGeShJLxPIyFIV6HAawUKQRcZBadMMqdu600e0em7xS4jK TZZlc0ZoNDuoJ/La8zDCrkQkcYCJQZH7d/7UpbkOx1VdvYQCBtZpBZP+YAAxkYNzRtcB rAaA== X-Forwarded-Encrypted: i=1; AJvYcCXTtkB8A/bF/tiBRYRv7uYc3llQ398ptYpY69sSC61TcQaN/fuWSJXU9JaggZsYS2s33XWtwqVW4PHz+/Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwJbx8jKHtLSG4HKVX6TVapPghIj7NbycvbHvozeMqtW5IzkuRe jQbfNw+kJiymniXBkZU1ui/VMN9Huf8ehMX9MsncCD1qzWo/8H2rFfE9x8QI+/BFfof8U3+jxMJ PntaIzN/2TA== X-Google-Smtp-Source: AGHT+IGY5+X5VenXLw4NgsPz1dwZLOq94AaciEsnNpmT8YVcLOiUIbz4W6A+tuywnF/VSXiWpM+G+Sts0TLw X-Received: from plwp2.prod.google.com ([2002:a17:903:2482:b0:234:bcd2:f39b]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:da92:b0:23d:dcf5:4806 with SMTP id d9443c01a7336-23f981d601emr106539755ad.39.1753374835791; Thu, 24 Jul 2025 09:33:55 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:56 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-17-irogers@google.com> Subject: [PATCH v6 16/22] perf machine: Explicitly pass in host perf_env From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When creating a machine for the host explicitly pass in a scoped perf_env. This removes a use of the global perf_env. Signed-off-by: Ian Rogers --- tools/perf/builtin-buildid-list.c | 5 ++++- tools/perf/builtin-kallsyms.c | 21 ++++++++++++++++----- tools/perf/builtin-trace.c | 24 +++++++++++++++++------- tools/perf/tests/code-reading.c | 3 +-- tools/perf/tests/dlfilter-test.c | 3 +-- tools/perf/tests/dwarf-unwind.c | 10 +++++++--- tools/perf/tests/mmap-thread-lookup.c | 6 +++++- tools/perf/tests/symbols.c | 8 +++++++- tools/perf/util/debug.c | 9 ++++++++- tools/perf/util/machine.c | 16 ++++++++-------- tools/perf/util/machine.h | 6 +++--- tools/perf/util/probe-event.c | 5 ++++- 12 files changed, 81 insertions(+), 35 deletions(-) diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid= -list.c index 151cd84b6dfe..a91bbb34ac94 100644 --- a/tools/perf/builtin-buildid-list.c +++ b/tools/perf/builtin-buildid-list.c @@ -45,11 +45,14 @@ static int buildid__map_cb(struct map *map, void *arg _= _maybe_unused) =20 static void buildid__show_kernel_maps(void) { + struct perf_env host_env; struct machine *machine; =20 - machine =3D machine__new_host(); + perf_env__init(&host_env); + machine =3D machine__new_host(&host_env); machine__for_each_kernel_map(machine, buildid__map_cb, NULL); machine__delete(machine); + perf_env__exit(&host_env); } =20 static int sysfs__fprintf_build_id(FILE *fp) diff --git a/tools/perf/builtin-kallsyms.c b/tools/perf/builtin-kallsyms.c index a3c2ffdc1af8..3c4339982b16 100644 --- a/tools/perf/builtin-kallsyms.c +++ b/tools/perf/builtin-kallsyms.c @@ -12,18 +12,28 @@ #include #include "debug.h" #include "dso.h" +#include "env.h" #include "machine.h" #include "map.h" #include "symbol.h" =20 static int __cmd_kallsyms(int argc, const char **argv) { - int i; - struct machine *machine =3D machine__new_kallsyms(); + int i, err; + struct perf_env host_env; + struct machine *machine =3D NULL; =20 + + perf_env__init(&host_env); + err =3D perf_env__set_cmdline(&host_env, argc, argv); + if (err) + goto out; + + machine =3D machine__new_kallsyms(&host_env); if (machine =3D=3D NULL) { pr_err("Couldn't read /proc/kallsyms\n"); - return -1; + err =3D -1; + goto out; } =20 for (i =3D 0; i < argc; ++i) { @@ -42,9 +52,10 @@ static int __cmd_kallsyms(int argc, const char **argv) map__unmap_ip(map, symbol->start), map__unmap_ip(map, symbol->end), symbol->start, symbol->end); } - +out: machine__delete(machine); - return 0; + perf_env__exit(&host_env); + return err; } =20 int cmd_kallsyms(int argc, const char **argv) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 0261f4eefe6d..5b53571de400 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -140,6 +140,7 @@ struct syscall_fmt { }; =20 struct trace { + struct perf_env host_env; struct perf_tool tool; struct { /** Sorted sycall numbers used by the trace. */ @@ -1977,17 +1978,24 @@ static char *trace__machine__resolve_kernel_addr(vo= id *vmachine, unsigned long l return machine__resolve_kernel_addr(vmachine, addrp, modp); } =20 -static int trace__symbols_init(struct trace *trace, struct evlist *evlist) +static int trace__symbols_init(struct trace *trace, int argc, const char *= *argv, + struct evlist *evlist) { int err =3D symbol__init(NULL); =20 if (err) return err; =20 - trace->host =3D machine__new_host(); - if (trace->host =3D=3D NULL) - return -ENOMEM; + perf_env__init(&trace->host_env); + err =3D perf_env__set_cmdline(&trace->host_env, argc, argv); + if (err) + goto out; =20 + trace->host =3D machine__new_host(&trace->host_env); + if (trace->host =3D=3D NULL) { + err =3D -ENOMEM; + goto out; + } thread__set_priv_destructor(thread_trace__delete); =20 err =3D trace_event__register_resolver(trace->host, trace__machine__resol= ve_kernel_addr); @@ -1998,9 +2006,10 @@ static int trace__symbols_init(struct trace *trace, = struct evlist *evlist) evlist->core.threads, trace__tool_process, true, false, 1); out: - if (err) + if (err) { + perf_env__exit(&trace->host_env); symbol__exit(); - + } return err; } =20 @@ -2009,6 +2018,7 @@ static void trace__symbols__exit(struct trace *trace) machine__exit(trace->host); trace->host =3D NULL; =20 + perf_env__exit(&trace->host_env); symbol__exit(); } =20 @@ -4428,7 +4438,7 @@ static int trace__run(struct trace *trace, int argc, = const char **argv) goto out_delete_evlist; } =20 - err =3D trace__symbols_init(trace, evlist); + err =3D trace__symbols_init(trace, argc, argv, evlist); if (err < 0) { fprintf(trace->output, "Problems initializing symbol libraries!\n"); goto out_delete_evlist; diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-readin= g.c index 0ec7004f90fe..9c2091310191 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c @@ -655,9 +655,8 @@ static int do_test_code_reading(bool try_kcore) =20 pid =3D getpid(); =20 - machine =3D machine__new_host(); perf_env__init(&host_env); - machine->env =3D &host_env; + machine =3D machine__new_host(&host_env); =20 ret =3D machine__create_kernel_maps(machine); if (ret < 0) { diff --git a/tools/perf/tests/dlfilter-test.c b/tools/perf/tests/dlfilter-t= est.c index 6427e3382711..80a1c941138d 100644 --- a/tools/perf/tests/dlfilter-test.c +++ b/tools/perf/tests/dlfilter-test.c @@ -353,9 +353,8 @@ static int test__dlfilter_test(struct test_data *td) return test_result("Failed to find program symbols", TEST_FAIL); =20 pr_debug("Creating new host machine structure\n"); - td->machine =3D machine__new_host(); perf_env__init(&host_env); - td->machine->env =3D &host_env; + td->machine =3D machine__new_host(&host_env); =20 td->fd =3D creat(td->perf_data_file_name, 0644); if (td->fd < 0) diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwin= d.c index 525c46b7971a..9ed78d00fb87 100644 --- a/tools/perf/tests/dwarf-unwind.c +++ b/tools/perf/tests/dwarf-unwind.c @@ -7,6 +7,7 @@ #include #include "tests.h" #include "debug.h" +#include "env.h" #include "machine.h" #include "event.h" #include "../util/unwind.h" @@ -180,6 +181,7 @@ NO_TAIL_CALL_ATTRIBUTE noinline int test_dwarf_unwind__= krava_1(struct thread *th noinline int test__dwarf_unwind(struct test_suite *test __maybe_unused, int subtest __maybe_unused) { + struct perf_env host_env; struct machine *machine; struct thread *thread; int err =3D -1; @@ -188,15 +190,16 @@ noinline int test__dwarf_unwind(struct test_suite *te= st __maybe_unused, callchain_param.record_mode =3D CALLCHAIN_DWARF; dwarf_callchain_users =3D true; =20 - machine =3D machine__new_live(/*kernel_maps=3D*/true, pid); + perf_env__init(&host_env); + machine =3D machine__new_live(&host_env, /*kernel_maps=3D*/true, pid); if (!machine) { pr_err("Could not get machine\n"); - return -1; + goto out; } =20 if (machine__create_kernel_maps(machine)) { pr_err("Failed to create kernel maps\n"); - return -1; + goto out; } =20 if (verbose > 1) @@ -213,6 +216,7 @@ noinline int test__dwarf_unwind(struct test_suite *test= __maybe_unused, =20 out: machine__delete(machine); + perf_env__exit(&host_env); return err; } =20 diff --git a/tools/perf/tests/mmap-thread-lookup.c b/tools/perf/tests/mmap-= thread-lookup.c index 446a3615d720..0c5619c6e6e9 100644 --- a/tools/perf/tests/mmap-thread-lookup.c +++ b/tools/perf/tests/mmap-thread-lookup.c @@ -8,6 +8,7 @@ #include #include #include "debug.h" +#include "env.h" #include "event.h" #include "tests.h" #include "machine.h" @@ -155,6 +156,7 @@ static int synth_process(struct machine *machine) =20 static int mmap_events(synth_cb synth) { + struct perf_env host_env; struct machine *machine; int err, i; =20 @@ -167,7 +169,8 @@ static int mmap_events(synth_cb synth) */ TEST_ASSERT_VAL("failed to create threads", !threads_create()); =20 - machine =3D machine__new_host(); + perf_env__init(&host_env); + machine =3D machine__new_host(&host_env); =20 dump_trace =3D verbose > 1 ? 1 : 0; =20 @@ -209,6 +212,7 @@ static int mmap_events(synth_cb synth) } =20 machine__delete(machine); + perf_env__exit(&host_env); return err; } =20 diff --git a/tools/perf/tests/symbols.c b/tools/perf/tests/symbols.c index b07fdf831868..f4ffe5804f40 100644 --- a/tools/perf/tests/symbols.c +++ b/tools/perf/tests/symbols.c @@ -5,6 +5,7 @@ #include #include "debug.h" #include "dso.h" +#include "env.h" #include "machine.h" #include "thread.h" #include "symbol.h" @@ -13,15 +14,18 @@ #include "tests.h" =20 struct test_info { + struct perf_env host_env; struct machine *machine; struct thread *thread; }; =20 static int init_test_info(struct test_info *ti) { - ti->machine =3D machine__new_host(); + perf_env__init(&ti->host_env); + ti->machine =3D machine__new_host(&ti->host_env); if (!ti->machine) { pr_debug("machine__new_host() failed!\n"); + perf_env__exit(&ti->host_env); return TEST_FAIL; } =20 @@ -29,6 +33,7 @@ static int init_test_info(struct test_info *ti) ti->thread =3D machine__findnew_thread(ti->machine, 100, 100); if (!ti->thread) { pr_debug("machine__findnew_thread() failed!\n"); + perf_env__exit(&ti->host_env); return TEST_FAIL; } =20 @@ -39,6 +44,7 @@ static void exit_test_info(struct test_info *ti) { thread__put(ti->thread); machine__delete(ti->machine); + perf_env__exit(&ti->host_env); } =20 struct dso_map { diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c index 2878a7363ac8..1dfa4d0eec4d 100644 --- a/tools/perf/util/debug.c +++ b/tools/perf/util/debug.c @@ -17,6 +17,7 @@ #include "addr_location.h" #include "color.h" #include "debug.h" +#include "env.h" #include "event.h" #include "machine.h" #include "map.h" @@ -309,8 +310,12 @@ void __dump_stack(FILE *file, void **stackdump, size_t= stackdump_size) { /* TODO: async safety. printf, malloc, etc. aren't safe inside a signal h= andler. */ pid_t pid =3D getpid(); - struct machine *machine =3D machine__new_live(/*kernel_maps=3D*/false, pi= d); + struct machine *machine; struct thread *thread =3D NULL; + struct perf_env host_env; + + perf_env__init(&host_env); + machine =3D machine__new_live(&host_env, /*kernel_maps=3D*/false, pid); =20 if (machine) thread =3D machine__find_thread(machine, pid, pid); @@ -323,6 +328,7 @@ void __dump_stack(FILE *file, void **stackdump, size_t = stackdump_size) */ backtrace_symbols_fd(stackdump, stackdump_size, fileno(file)); machine__delete(machine); + perf_env__exit(&host_env); return; } #endif @@ -349,6 +355,7 @@ void __dump_stack(FILE *file, void **stackdump, size_t = stackdump_size) } thread__put(thread); machine__delete(machine); + perf_env__exit(&host_env); } =20 /* Obtain a backtrace and print it to stdout. */ diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 2ef8c1cfae1e..b5dd42588c91 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -129,7 +129,7 @@ int machine__init(struct machine *machine, const char *= root_dir, pid_t pid) return 0; } =20 -static struct machine *__machine__new_host(bool kernel_maps) +static struct machine *__machine__new_host(struct perf_env *host_env, bool= kernel_maps) { struct machine *machine =3D malloc(sizeof(*machine)); =20 @@ -142,13 +142,13 @@ static struct machine *__machine__new_host(bool kerne= l_maps) free(machine); return NULL; } - machine->env =3D &perf_env; + machine->env =3D host_env; return machine; } =20 -struct machine *machine__new_host(void) +struct machine *machine__new_host(struct perf_env *host_env) { - return __machine__new_host(/*kernel_maps=3D*/true); + return __machine__new_host(host_env, /*kernel_maps=3D*/true); } =20 static int mmap_handler(const struct perf_tool *tool __maybe_unused, @@ -168,9 +168,9 @@ static int machine__init_live(struct machine *machine, = pid_t pid) mmap_handler, machine, true); } =20 -struct machine *machine__new_live(bool kernel_maps, pid_t pid) +struct machine *machine__new_live(struct perf_env *host_env, bool kernel_m= aps, pid_t pid) { - struct machine *machine =3D __machine__new_host(kernel_maps); + struct machine *machine =3D __machine__new_host(host_env, kernel_maps); =20 if (!machine) return NULL; @@ -182,9 +182,9 @@ struct machine *machine__new_live(bool kernel_maps, pid= _t pid) return machine; } =20 -struct machine *machine__new_kallsyms(void) +struct machine *machine__new_kallsyms(struct perf_env *host_env) { - struct machine *machine =3D machine__new_host(); + struct machine *machine =3D machine__new_host(host_env); /* * FIXME: * 1) We should switch to machine__load_kallsyms(), i.e. not explicitly diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h index 180b369c366c..22a42c5825fa 100644 --- a/tools/perf/util/machine.h +++ b/tools/perf/util/machine.h @@ -169,9 +169,9 @@ struct thread *machine__findnew_guest_code(struct machi= ne *machine, pid_t pid); void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size); void machines__set_comm_exec(struct machines *machines, bool comm_exec); =20 -struct machine *machine__new_host(void); -struct machine *machine__new_kallsyms(void); -struct machine *machine__new_live(bool kernel_maps, pid_t pid); +struct machine *machine__new_host(struct perf_env *host_env); +struct machine *machine__new_kallsyms(struct perf_env *host_env); +struct machine *machine__new_live(struct perf_env *host_env, bool kernel_m= aps, pid_t pid); int machine__init(struct machine *machine, const char *root_dir, pid_t pid= ); void machine__exit(struct machine *machine); void machine__delete_threads(struct machine *machine); diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index e11c1be5c6d5..85e096ed07e6 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -75,12 +75,14 @@ int e_snprintf(char *str, size_t size, const char *form= at, ...) } =20 static struct machine *host_machine; +static struct perf_env host_env; =20 /* Initialize symbol maps and path of vmlinux/modules */ int init_probe_symbol_maps(bool user_only) { int ret; =20 + perf_env__init(&host_env); symbol_conf.allow_aliases =3D true; ret =3D symbol__init(NULL); if (ret < 0) { @@ -94,7 +96,7 @@ int init_probe_symbol_maps(bool user_only) if (symbol_conf.vmlinux_name) pr_debug("Use vmlinux: %s\n", symbol_conf.vmlinux_name); =20 - host_machine =3D machine__new_host(); + host_machine =3D machine__new_host(&host_env); if (!host_machine) { pr_debug("machine__new_host() failed.\n"); symbol__exit(); @@ -111,6 +113,7 @@ void exit_probe_symbol_maps(void) machine__delete(host_machine); host_machine =3D NULL; symbol__exit(); + perf_env__exit(&host_env); } =20 static struct ref_reloc_sym *kernel_get_ref_reloc_sym(struct map **pmap) --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:11 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 224D12EF2AE for ; Thu, 24 Jul 2025 16:33:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374840; cv=none; b=dJLWppE5fQcBNen6QXvGs8tdALVBAAYxs8b09tRw3byXYYFS6VAz0L2PZsrIUxxbVJuzhMZcgyGeJII75QEPU1HvUkLLeQwNUzf6lvfw7Np3gJUyff7LhIQE+ybPziYA8pKbyVPf4pOpJbzIeDJ/CEhCDo8me3iQ8Gwx6QFcpZ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374840; c=relaxed/simple; bh=t81xmNlXwmr3zilOlaXEyUvx+kcnM8s9RqOFn/g1kBY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=YuqBvn71VdZOKzbSyzgPE/WQgaV++5Rhr4C+atXELovPDMJCGVwlilR9JSevCmMjz+WRf7pT94mJgUc//U2LGMTyaHXYxpCu+HhK0rx8RpJZQoFYTWOE8SmAlbgZ+jWudpN/TERyeK9sSytMU+/dqQ7QV8YkWcdwwvHPe1e5zXs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=GjDdZ5uN; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="GjDdZ5uN" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-23692793178so13002795ad.0 for ; Thu, 24 Jul 2025 09:33:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374838; x=1753979638; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=mPfRZHTdYSHdPtlzDRqGTvzY0SLHPDTff14m/+O2q2c=; b=GjDdZ5uN0IVP9/YJc++FmIQrO1nSOelHehl/SrLVhygg1Dt0rwIrkxXk4XcTMT5Ck7 HUV+ZNSOmvmEhxp/z+NRQVLa4YYrvJLMX4fXHtHgJn9s17pQgjVFZ3xBsw9l8ojfUzEs wb7uAi1FjMUUZwsD9aOglC3fpVZYTFMZ1gFhDL3t7Rt9Tkt1nsOBaVwlDXMcmSU+chho g5kTNKTpi2ZVxMA88BhWYn6y2WoUJIn3A6XvKw8AJEjdVo5MnFUMWEZzuMZ3lNLAI0ut hnuYUags4s3Yuw7ixB5iQ7rrnenGHNaEcVdhtn1WAmQsSRBHA6rixMYwoSHU5Yhu2tVP dmPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374838; x=1753979638; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mPfRZHTdYSHdPtlzDRqGTvzY0SLHPDTff14m/+O2q2c=; b=eL+ZbTrfwvLvKhFigNFBIctARSgszkBpHFnBuucdEXazCLPDUTdV5eFOPwvz1gLacU WYCt5bDTsfLbE0A63uHcr4Z6sjKiVyXrH1gdBaw9SnxdXMd5a0XiSut9FGXMw7YtyV9O 9ebdKxuERbPCfXC3aMEpdDGNv7Uc3YODX51053SbwWOFdLcG/HAjpy2BWJkCZktdsaqW k351DA7IVzBeSe6ADGnpQHVa5XAbKAKOYltnxpNLiiDk+ltWYi1FexyGkB0+r6tOmgTR dnIj/WYNBQUwQLPL9POc7Y6p2ofewDydZ5dlzMcfUN3OBewWvXrI9PEqN4O9mdZLphOn XSsw== X-Forwarded-Encrypted: i=1; AJvYcCWkUuBCNzVL5awOU2Vu7cnFarsFvrpZSH2xY2wc3zwR/nIPx0u7ly2GVep15q8IUXcBJysvFVmlaVx2qrs=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9zhM5ikxt4I9ytPBmVFIn6FHIlPfthBy1J0NcX+JnAs+sQha9 rTUqhZ5wJcCudtv+DOW28fZAw1SlZpPTSIu3NCypyKuykkJQlP2n9IOg6JwHoBahp2lU8zXYOGL Tf/QpLD7jUA== X-Google-Smtp-Source: AGHT+IFvl8qTn5wPLStLonMQXuHNn5wuTPXihQ8/0C1V+YeHw5UxQDED+F0g9aj5SyAJaXew8lVy9yJvdxPI X-Received: from pjbsc10.prod.google.com ([2002:a17:90b:510a:b0:311:a4ee:7c3d]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2282:b0:236:6fbb:a5f3 with SMTP id d9443c01a7336-23f9821c52amr105502325ad.40.1753374837903; Thu, 24 Jul 2025 09:33:57 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:57 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-18-irogers@google.com> Subject: [PATCH v6 17/22] perf auxtrace: Pass perf_env from session through to mmap read From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" auxtrace_mmap__read and auxtrace_mmap__read_snapshot end up calling `evsel__env(NULL)` which returns the global perf_env variable for the host. Their only call is in perf record. Rather than use the global variable pass through the perf_env for `perf record`. Signed-off-by: Ian Rogers --- tools/perf/builtin-record.c | 8 ++++++-- tools/perf/util/auxtrace.c | 13 +++++++------ tools/perf/util/auxtrace.h | 6 ++++-- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 8a829ddff6f2..7ea3a11aca70 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -775,7 +775,9 @@ static int record__auxtrace_mmap_read(struct record *re= c, { int ret; =20 - ret =3D auxtrace_mmap__read(map, rec->itr, &rec->tool, + ret =3D auxtrace_mmap__read(map, rec->itr, + perf_session__env(rec->session), + &rec->tool, record__process_auxtrace); if (ret < 0) return ret; @@ -791,7 +793,9 @@ static int record__auxtrace_mmap_read_snapshot(struct r= ecord *rec, { int ret; =20 - ret =3D auxtrace_mmap__read_snapshot(map, rec->itr, &rec->tool, + ret =3D auxtrace_mmap__read_snapshot(map, rec->itr, + perf_session__env(rec->session), + &rec->tool, record__process_auxtrace, rec->opts.auxtrace_snapshot_size); if (ret < 0) diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c index 03211c2623de..ebd32f1b8f12 100644 --- a/tools/perf/util/auxtrace.c +++ b/tools/perf/util/auxtrace.c @@ -1890,7 +1890,7 @@ int __weak compat_auxtrace_mmap__write_tail(struct au= xtrace_mmap *mm, u64 tail) } =20 static int __auxtrace_mmap__read(struct mmap *map, - struct auxtrace_record *itr, + struct auxtrace_record *itr, struct perf_env *env, const struct perf_tool *tool, process_auxtrace_t fn, bool snapshot, size_t snapshot_size) { @@ -1900,7 +1900,7 @@ static int __auxtrace_mmap__read(struct mmap *map, size_t size, head_off, old_off, len1, len2, padding; union perf_event ev; void *data1, *data2; - int kernel_is_64_bit =3D perf_env__kernel_is_64_bit(evsel__env(NULL)); + int kernel_is_64_bit =3D perf_env__kernel_is_64_bit(env); =20 head =3D auxtrace_mmap__read_head(mm, kernel_is_64_bit); =20 @@ -2002,17 +2002,18 @@ static int __auxtrace_mmap__read(struct mmap *map, } =20 int auxtrace_mmap__read(struct mmap *map, struct auxtrace_record *itr, - const struct perf_tool *tool, process_auxtrace_t fn) + struct perf_env *env, const struct perf_tool *tool, + process_auxtrace_t fn) { - return __auxtrace_mmap__read(map, itr, tool, fn, false, 0); + return __auxtrace_mmap__read(map, itr, env, tool, fn, false, 0); } =20 int auxtrace_mmap__read_snapshot(struct mmap *map, - struct auxtrace_record *itr, + struct auxtrace_record *itr, struct perf_env *env, const struct perf_tool *tool, process_auxtrace_t fn, size_t snapshot_size) { - return __auxtrace_mmap__read(map, itr, tool, fn, true, snapshot_size); + return __auxtrace_mmap__read(map, itr, env, tool, fn, true, snapshot_size= ); } =20 /** diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h index b0db84d27b25..f001cbb68f8e 100644 --- a/tools/perf/util/auxtrace.h +++ b/tools/perf/util/auxtrace.h @@ -23,6 +23,7 @@ union perf_event; struct perf_session; struct evlist; struct evsel; +struct perf_env; struct perf_tool; struct mmap; struct perf_sample; @@ -512,10 +513,11 @@ typedef int (*process_auxtrace_t)(const struct perf_t= ool *tool, size_t len1, void *data2, size_t len2); =20 int auxtrace_mmap__read(struct mmap *map, struct auxtrace_record *itr, - const struct perf_tool *tool, process_auxtrace_t fn); + struct perf_env *env, const struct perf_tool *tool, + process_auxtrace_t fn); =20 int auxtrace_mmap__read_snapshot(struct mmap *map, - struct auxtrace_record *itr, + struct auxtrace_record *itr, struct perf_env *env, const struct perf_tool *tool, process_auxtrace_t fn, size_t snapshot_size); =20 --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:11 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 37BF62EB5DA for ; Thu, 24 Jul 2025 16:34:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374842; cv=none; b=Xf1ZOMuc4NCHK0f8O9sDCUbvhjXqvoIROWCYqMpS76IEzJBA3LFusCuy3ZCVvlulxPM5VZwk2aWG74QDJrIGAy4Qk7MpzhyBZAjRI/+d+FiAoAWNOn8PJ8YiajPqgmWDGzI4r9oFpx+ULpN+6kWaUdmaARq2CTOekQNyQb7YklU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374842; c=relaxed/simple; bh=B3goMpnbsjDr39b5KtiVKhjmweQme1UjU2wsV6E5F3k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=gOjPM5SuAkrKjiI3nVbPZ/qRhq+JiIqw8jeqAk4dsiogy/uPSBBnPmJ8ltk11qshodgeCmIR3sT1Hf0IDATNCDaXG0rUvr+sDdotRA6IFWBJp8zPd2XWDwhQ+x4vy+rYCvdJy9H6WC/i4yNL4/ssMdC50KNV9tN7bRJtcCGv0G8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=qPVHhyvb; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="qPVHhyvb" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-235c897d378so12373815ad.1 for ; Thu, 24 Jul 2025 09:34:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374840; x=1753979640; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=clK8vcOX6E/bs4PxJyJSQn9+V4CD0DaLAQdF7P7NBBE=; b=qPVHhyvbDrVy5pWlqVE5Cr3XQNTi18SKU25ZGE2ln5DnZ51gmPMlqqFl1TNDEt7QKE YrUHbIiyJ1FgoQEcm05Xy4jhvVrNrnvO597AbB1ZGjcHOKyxU2+UH4+7hY6IHGYQet/x 5KHnQMckDgAZeRDvAO7TwJUdbmL0679mpgMLDcUvb5BqX0d9UpLRGpKZkVjnt+DH7nfb IB/1lo19ibOALqv/tN6rUpYgOjnnzf7JgKxBVKd/mSPY4z+X4IyVzV7C3iBphEfgT+sB Rb9/osL88m8f6DIHg3U4sYtZfcp4wexst5B+umhYYE1MiziBTnF18zud2+YfkUseeiVx tzRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374840; x=1753979640; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=clK8vcOX6E/bs4PxJyJSQn9+V4CD0DaLAQdF7P7NBBE=; b=TMNcLbdiOuCK1EtjzTNvWBUrR2oCkzNjVALtPtCloh1x5/5aBxarInI+L+4nf4iwBl mqHJJB8hXctQXUTWwf6A/c9PwbAiwL+7xVtUjo1Uc3v/N4Wczr/uM2ecs1C9syCBM+8x L9LlgxrhpxZt3s+Vskhu8QhgRm6vipxGdbcF5K545DBTkEleewIDUw2mNAUTjfnwzlvs ARBv2o+WLj8fKlV7SJozeye3z0Hh+VjhQ02XoHxlKZ6RkO2tue29oZ8sME49khXZiw9p WiMtCrRhrouytlhpM0q1bG0IWR7mORsvoDTWJnU6f8bE97V6u6M6bThIbh+lrdHbsP62 Y3pA== X-Forwarded-Encrypted: i=1; AJvYcCWPyl63/m9Cwrm2tDRKfd3u1bq+BwI5Gu6jBNBfG36CGBXrq2/KCcu9cqhd+U8DHRRq2Pm/WbDGetBSYNM=@vger.kernel.org X-Gm-Message-State: AOJu0Yx1AfdfMwu6sQEZWv+ZQeXP8qFbsktSk+RU3agaHWpPr5OEDT3m 8+9eZ2YV/IRWuwEtbWII048+N8Wwbo59BupO1eL2etyLmU65c4sssQxDbRs2k7M6F/owLKV/al9 F5//HgChOdA== X-Google-Smtp-Source: AGHT+IFs4cam1AaAoF/Vp4cWg0jO82CTqSj6HoFS+8xQ13Gbky/TFSjDAnLfzZQcuuJDQACSIrH5Tl7jnAOI X-Received: from plch20.prod.google.com ([2002:a17:902:f2d4:b0:231:6301:a4a3]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1a8d:b0:234:d292:be7f with SMTP id d9443c01a7336-23f981bb9c5mr114213655ad.31.1753374840024; Thu, 24 Jul 2025 09:34:00 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:58 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-19-irogers@google.com> Subject: [PATCH v6 18/22] perf trace: Avoid global perf_env with evsel__env From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" There is no session in perf trace unless in replay mode, so in host mode no session can be associated with the evlist. If the evsel__env call fails resort to the host_env that's part of the trace. Remove errno_to_name as it becomes a called once 1-line function once the argument is turned into a perf_env, just call perf_env__arch_strerrno directly. Signed-off-by: Ian Rogers --- tools/perf/builtin-trace.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 5b53571de400..fe737b3ac6e6 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -2898,13 +2898,6 @@ static int trace__fprintf_callchain(struct trace *tr= ace, struct perf_sample *sam return sample__fprintf_callchain(sample, 38, print_opts, get_tls_callchai= n_cursor(), symbol_conf.bt_stop_list, trace->output); } =20 -static const char *errno_to_name(struct evsel *evsel, int err) -{ - struct perf_env *env =3D evsel__env(evsel); - - return perf_env__arch_strerrno(env, err); -} - static int trace__sys_exit(struct trace *trace, struct evsel *evsel, union perf_event *event __maybe_unused, struct perf_sample *sample) @@ -2990,8 +2983,9 @@ static int trace__sys_exit(struct trace *trace, struc= t evsel *evsel, } else if (ret < 0) { errno_print: { char bf[STRERR_BUFSIZE]; - const char *emsg =3D str_error_r(-ret, bf, sizeof(bf)), - *e =3D errno_to_name(evsel, -ret); + struct perf_env *env =3D evsel__env(evsel) ?: &trace->host_env; + const char *emsg =3D str_error_r(-ret, bf, sizeof(bf)); + const char *e =3D perf_env__arch_strerrno(env, err); =20 fprintf(trace->output, "-1 %s (%s)", e, emsg); } --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:11 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 304422EF649 for ; Thu, 24 Jul 2025 16:34:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374844; cv=none; b=jizTNqHZQCz7/SuG5CDsCaOD10qYYFyoUZyXtS767bL/XbABKm8jRmCN3Ssj4KSKKwy/zpzfbQ+0IS0+EmLkWc8dbUQlqoSFGXWNYDPxrJ1NKKqx7Zui72UfiwkqTxT/tJxXiZJ5vhGlGqCcya4GoX86BFpr/yrFbYv+vM7kyCU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374844; c=relaxed/simple; bh=i6U8ftE0GheEC5KsTdZQzjMgFHJQer4WjyEZzq14zu4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=pqcjJHs8FZa0L829KS/Vgluerh2bnCaGZSBm5Yu7yM9K6TKXKFP1oo09cIvqVja6OkxzOJ60OMeiBrvegO87UtwqNbGtKOgmyewhjfEZ+RwgvBBC/6kJlx2wPvyEs7zVJtHY8KQSnQR5blXmBdToZP+TyFmkHKtNAnK8ERhHcos= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=QSakDila; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="QSakDila" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2356ce66d7cso18050365ad.1 for ; Thu, 24 Jul 2025 09:34:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374843; x=1753979643; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=3+Lxwmm+nqsslwRWHv17UsJG7rPlnmpUyi3S/jbxfBM=; b=QSakDilaUWby/IetO9Fih/BYggkq0Zy3bfU0pLoO7cZLp3GC7cFcqsFEz8Q2abbuHb 7PkWPhh74hU8FDr2FhTGEfxWQ77TcK78/o6MFbDqXPQQq8AiUZDInmQlIowvgWFqqVb7 ZrnGua0LSVj1hgqX6aO8aCqBxIwRtmkonpBFgUsR4JoD0Dr8RNP93/tW0y3dxa51IAct mB4zldvvufLEH4bv4qhs7SkNRk4MLgNj2Ya7WSiMu7caUfDkreZJ/2pgFFP5U+LdMqY3 pFxtYuP2HMkyX8PUNn6QdjPf97NXhpdwqbpgJc5ElJHHPUOWjdo/08Pv0Nls2FVq2v2J bQKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374843; x=1753979643; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=3+Lxwmm+nqsslwRWHv17UsJG7rPlnmpUyi3S/jbxfBM=; b=Gaa7E4LMFodBv4Hw7ViqkGIYjuq5yI8Mok3wk4i3+IAjYN/UpWayvX9AOh70DjUtVj Do31j+C9jIXAsVu1ViMPI83lsUNmt9JKXWdybKmQ74K9ubn0mIw0um3TDLRlRohoEpLr NRFaH3UKOW0SjLPK944LeYjgcz9FmiM0sB76O5fW0ZPmUmLPubWUTPmeeHkO1fBJm8KA fIz+wHJV17XDbrzbHXu/+mpFhvI8wU+ymni/udCypClGmJzBVUGvEZKighHHy4vtgsr1 mj4Hn72ztLSJyDtkqgBOOEVWXm0q4cTOjUphMPBisdfQfIb0K20NBByG+5nxsh91LmFd iJ4g== X-Forwarded-Encrypted: i=1; AJvYcCUap4/wugblUgINVFzsvcNs3p0zSrzOzKiNEzZdWSvMc2frcR7vmcA+QOPPBU78jAUITYeL7PTjPZXP2SQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yx3+rOBWi4RoBubiJoYAdPLr0mVDxJQB7ttGLq/yHr8oMuvG3p0 8bTE/BktDGJvHmTOEwIkgCgzuas7YbUEoi8lSlIgjPzxCQBlgN397CXMPQoV9I29qCxfY1pRGEV YwmGMJBWINQ== X-Google-Smtp-Source: AGHT+IG6stcm2xMzqdr2bWYWwNtxudMcIgVhUoAdZRaNmO+ro5zkMJubKjpS0mOvfw0dEHDd2ygGQIYxkGo2 X-Received: from pllj23.prod.google.com ([2002:a17:902:7597:b0:234:bca4:b7b3]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:f8c:b0:22e:3c2:d477 with SMTP id d9443c01a7336-23f9819366emr100620545ad.25.1753374842620; Thu, 24 Jul 2025 09:34:02 -0700 (PDT) Date: Thu, 24 Jul 2025 09:32:59 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-20-irogers@google.com> Subject: [PATCH v6 19/22] perf env: Remove global perf_env From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The global perf_env was used for the host, but if a perf_env wasn't easy to come by it was used in a lot of places where potentially recorded and host data could be confused. Remove the global variable as now the majority of accesses retrieve the perf_env for the host from the session. Signed-off-by: Ian Rogers --- tools/perf/perf.c | 3 --- tools/perf/util/bpf-event.c | 2 +- tools/perf/util/env.c | 2 -- tools/perf/util/env.h | 2 -- tools/perf/util/evsel.c | 2 +- tools/perf/util/session.c | 3 ++- 6 files changed, 4 insertions(+), 10 deletions(-) diff --git a/tools/perf/perf.c b/tools/perf/perf.c index f0617cc41f5f..88c60ecf3395 100644 --- a/tools/perf/perf.c +++ b/tools/perf/perf.c @@ -346,12 +346,9 @@ static int run_builtin(struct cmd_struct *p, int argc,= const char **argv) use_pager =3D 1; commit_pager_choice(); =20 - perf_env__init(&perf_env); - perf_env__set_cmdline(&perf_env, argc, argv); status =3D p->fn(argc, argv); perf_config__exit(); exit_browser(status); - perf_env__exit(&perf_env); =20 if (status) return status & 0xff; diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c index 664f361ef8c1..5b6d3e899e11 100644 --- a/tools/perf/util/bpf-event.c +++ b/tools/perf/util/bpf-event.c @@ -549,7 +549,7 @@ static int perf_event__synthesize_one_bpf_prog(struct p= erf_session *session, * for perf-record and perf-report use header.env; * otherwise, use global perf_env. */ - env =3D session->data ? perf_session__env(session) : &perf_env; + env =3D perf_session__env(session); =20 arrays =3D 1UL << PERF_BPIL_JITED_KSYMS; arrays |=3D 1UL << PERF_BPIL_JITED_FUNC_LENS; diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c index c09159083bf0..c8c248754621 100644 --- a/tools/perf/util/env.c +++ b/tools/perf/util/env.c @@ -19,8 +19,6 @@ #include "strbuf.h" #include "trace/beauty/beauty.h" =20 -struct perf_env perf_env; - #ifdef HAVE_LIBBPF_SUPPORT #include "bpf-event.h" #include "bpf-utils.h" diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h index d8df59072529..e00179787a34 100644 --- a/tools/perf/util/env.h +++ b/tools/perf/util/env.h @@ -150,8 +150,6 @@ enum perf_compress_type { struct bpf_prog_info_node; struct btf_node; =20 -extern struct perf_env perf_env; - int perf_env__read_core_pmu_caps(struct perf_env *env); void perf_env__exit(struct perf_env *env); =20 diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 19d9d6d6a4b2..e4a52f4b0af0 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -3869,7 +3869,7 @@ struct perf_env *evsel__env(struct evsel *evsel) { struct perf_session *session =3D evsel__session(evsel); =20 - return session ? perf_session__env(session) : &perf_env; + return session ? perf_session__env(session) : NULL; } =20 static int store_evsel_ids(struct evsel *evsel, struct evlist *evlist) diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 36532329a633..2a79e6844f36 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -192,7 +192,8 @@ struct perf_session *__perf_session__new(struct perf_da= ta *data, symbol_conf.kallsyms_name =3D perf_data__kallsyms_name(data); } } else { - session->machines.host.env =3D host_env ?: &perf_env; + assert(host_env !=3D NULL); + session->machines.host.env =3D host_env; } if (session->evlist) session->evlist->session =3D session; --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:11 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DACDC2EF9DD for ; Thu, 24 Jul 2025 16:34:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374847; cv=none; b=Oee1zIR5UyqnpXtNt8Tmr862uWRQPnh8sZvUJyFwmjsCxS2HFe/6dd+Nn+ni+EXxfspv0eKaOKR1v5fpZDQ9hPZDvgArTmnBy7mVfHliO0gtI0GPZwH42nnqQhmOre52QnSLLL6oGSaj0ANuDZqMLbMGTmeoBQs+iOTH5OYVsDI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374847; c=relaxed/simple; bh=GOtxzQlYe3sbLjIN3sN75f+UTSNIwyDGS/2BGS2Boyo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=oXVOUP3gX+XTijC22y+QNOiRDGUy4ChWi2GNQnFY3pr2H9vAE2WkufnSvLsEucFsar3DBpep17rEEip4SE7DFKJpL5fR4BMXPeZ52eYVVkFz1u6Eg+5IVRQuaUW6GT8AKw/kHGDkm2uUxnv1gdw9LAOxdQmz7uRh3rZIj/LBd1E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=wQA2mWTu; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="wQA2mWTu" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-235e1d70d67so11711075ad.0 for ; Thu, 24 Jul 2025 09:34:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374845; x=1753979645; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=fdxw9xzQEGKIPLNVqIHrpPLnMAqAFNBUSxOmG1YpohM=; b=wQA2mWTuPmtO2RLGNoh1A6TRNTcfpGqyAqGBoulbXfF6+x03lkRDREluiXl+hkYCnz Hl42x2ZQ8jw78fHgZu1DCgMGOJ9Tsg6zDf1jvXj/0DIwI2IFfdKbKWwJh5hw9tMzPDZ+ Yel/MzuplV9QD3SauS/Ui8+lXY3SRhHQ2Y7Q8eJaVXB1kej18rkbcVVxWo5lY3Qkr5wX 84vvn9HI78n9MU22uuDyNBMc63PeSDXz/zRpzQX9J7Uaa0MBxZedhQz2dU4lV6wlz5tl 949++8KUzAyQ9ev1I+7NW3IRNoHQPqI1nBRhNa7Uz6UhG0ncLAfTm35sUPYpdQpQQFnx 39Pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374845; x=1753979645; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=fdxw9xzQEGKIPLNVqIHrpPLnMAqAFNBUSxOmG1YpohM=; b=SeluzMco66NbrBB8gwVY/33wCkJ4PCuM+/KfzOgEqxsmteOWN+f3/UfxvlMtoFIKsR X/dgzcBqygVBjnpynMw42rU0gZLlsstQvqvX6dmergPCI7E2kI02XxwRy8GsInh2wPrO 76JN6IRuVOBQlzIbYUnzU7IDf4JUQCOaHyVm5B0tXx6cPVNC6ecSJa8ceNFEzaoyAouo PgrrjzWNyiSUXqjO/MPoXjB662wsurkuXSrkvLXSiwOz/TGpJdxX12rcoTCJijw8ddBd 5TwJmCPw3arlk3M3Lf1wSNd8dhVID2ysjFkbt8Bnty1m+McEopUb9vMVsnzSwSZgA/JZ BVYA== X-Forwarded-Encrypted: i=1; AJvYcCXUs4fyQZb6CtwvR2nZvEili8ZmYxoqL6bipnFoIDRXcwKthfuDfgCz5sdlSzm6hR1hw5t+FAR//nYzDFg=@vger.kernel.org X-Gm-Message-State: AOJu0YxkEbddxW5q8tdLx+gH8e9iFE7ydNmg8I4dfCkehb7xVzC1CDbU Hj+kielp1fjzewDCEpc3mP4Tl36LqUqbgyoUXYnpsdvRKw5802+qSqFc8t6EfBsw2xIM1jw0SX1 unXazfSvLIw== X-Google-Smtp-Source: AGHT+IHCRpyU9ii804LfL6OKryNgB2KgE4vQP+Q33YtbQkKZ/CvrsDCaeciYUlVcmHbFDYslJMqvcmI/97sy X-Received: from pjbos14.prod.google.com ([2002:a17:90b:1cce:b0:30a:31eb:ec8e]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d486:b0:234:ed31:fc98 with SMTP id d9443c01a7336-23f981cca92mr97923225ad.37.1753374844805; Thu, 24 Jul 2025 09:34:04 -0700 (PDT) Date: Thu, 24 Jul 2025 09:33:00 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-21-irogers@google.com> Subject: [PATCH v6 20/22] perf sample: Remove arch notion of sample parsing From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" By definition arch sample parsing and synthesis will inhibit certain kinds of cross-platform record then analysis (report, script, etc.). Remove arch_perf_parse_sample_weight and arch_perf_synthesize_sample_weight replacing with a common implementation. Combine perf_sample p_stage_cyc and retire_lat as weight3 to capture the differing uses regardless of compiled for architecture. Signed-off-by: Ian Rogers --- tools/perf/arch/powerpc/util/event.c | 26 --------------------- tools/perf/arch/x86/tests/sample-parsing.c | 4 ++-- tools/perf/arch/x86/util/event.c | 27 ---------------------- tools/perf/builtin-script.c | 2 +- tools/perf/util/dlfilter.c | 2 +- tools/perf/util/event.h | 2 -- tools/perf/util/evsel.c | 17 ++++++++++---- tools/perf/util/hist.c | 4 ++-- tools/perf/util/hist.h | 3 ++- tools/perf/util/intel-tpebs.c | 4 ++-- tools/perf/util/sample.h | 6 ++--- tools/perf/util/session.c | 2 +- tools/perf/util/sort.c | 7 +++--- tools/perf/util/synthetic-events.c | 10 ++++++-- 14 files changed, 36 insertions(+), 80 deletions(-) diff --git a/tools/perf/arch/powerpc/util/event.c b/tools/perf/arch/powerpc= /util/event.c index 77d8cc2b5691..024ac8b54c33 100644 --- a/tools/perf/arch/powerpc/util/event.c +++ b/tools/perf/arch/powerpc/util/event.c @@ -11,32 +11,6 @@ #include "../../../util/debug.h" #include "../../../util/sample.h" =20 -void arch_perf_parse_sample_weight(struct perf_sample *data, - const __u64 *array, u64 type) -{ - union perf_sample_weight weight; - - weight.full =3D *array; - if (type & PERF_SAMPLE_WEIGHT) - data->weight =3D weight.full; - else { - data->weight =3D weight.var1_dw; - data->ins_lat =3D weight.var2_w; - data->p_stage_cyc =3D weight.var3_w; - } -} - -void arch_perf_synthesize_sample_weight(const struct perf_sample *data, - __u64 *array, u64 type) -{ - *array =3D data->weight; - - if (type & PERF_SAMPLE_WEIGHT_STRUCT) { - *array &=3D 0xffffffff; - *array |=3D ((u64)data->ins_lat << 32); - } -} - const char *arch_perf_header_entry(const char *se_header) { if (!strcmp(se_header, "Local INSTR Latency")) diff --git a/tools/perf/arch/x86/tests/sample-parsing.c b/tools/perf/arch/x= 86/tests/sample-parsing.c index a061e8619267..22feec23e53d 100644 --- a/tools/perf/arch/x86/tests/sample-parsing.c +++ b/tools/perf/arch/x86/tests/sample-parsing.c @@ -29,7 +29,7 @@ static bool samples_same(const struct perf_sample *s1, { if (type & PERF_SAMPLE_WEIGHT_STRUCT) { COMP(ins_lat); - COMP(retire_lat); + COMP(weight3); } =20 return true; @@ -50,7 +50,7 @@ static int do_test(u64 sample_type) struct perf_sample sample =3D { .weight =3D 101, .ins_lat =3D 102, - .retire_lat =3D 103, + .weight3 =3D 103, }; struct perf_sample sample_out; size_t i, sz, bufsz; diff --git a/tools/perf/arch/x86/util/event.c b/tools/perf/arch/x86/util/ev= ent.c index a0400707180c..576c1c36046c 100644 --- a/tools/perf/arch/x86/util/event.c +++ b/tools/perf/arch/x86/util/event.c @@ -92,33 +92,6 @@ int perf_event__synthesize_extra_kmaps(const struct perf= _tool *tool, =20 #endif =20 -void arch_perf_parse_sample_weight(struct perf_sample *data, - const __u64 *array, u64 type) -{ - union perf_sample_weight weight; - - weight.full =3D *array; - if (type & PERF_SAMPLE_WEIGHT) - data->weight =3D weight.full; - else { - data->weight =3D weight.var1_dw; - data->ins_lat =3D weight.var2_w; - data->retire_lat =3D weight.var3_w; - } -} - -void arch_perf_synthesize_sample_weight(const struct perf_sample *data, - __u64 *array, u64 type) -{ - *array =3D data->weight; - - if (type & PERF_SAMPLE_WEIGHT_STRUCT) { - *array &=3D 0xffffffff; - *array |=3D ((u64)data->ins_lat << 32); - *array |=3D ((u64)data->retire_lat << 48); - } -} - const char *arch_perf_header_entry(const char *se_header) { if (!strcmp(se_header, "Local Pipeline Stage Cycle")) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index f2b5620165b4..d9fbdcf72f25 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2252,7 +2252,7 @@ static void process_event(struct perf_script *script, fprintf(fp, "%16" PRIu16, sample->ins_lat); =20 if (PRINT_FIELD(RETIRE_LAT)) - fprintf(fp, "%16" PRIu16, sample->retire_lat); + fprintf(fp, "%16" PRIu16, sample->weight3); =20 if (PRINT_FIELD(CGROUP)) { const char *cgrp_name; diff --git a/tools/perf/util/dlfilter.c b/tools/perf/util/dlfilter.c index ddacef881af2..c0afcbd954f8 100644 --- a/tools/perf/util/dlfilter.c +++ b/tools/perf/util/dlfilter.c @@ -513,6 +513,7 @@ int dlfilter__do_filter_event(struct dlfilter *d, d->d_addr_al =3D &d_addr_al; =20 d_sample.size =3D sizeof(d_sample); + d_sample.p_stage_cyc =3D sample->weight3; d_ip_al.size =3D 0; /* To indicate d_ip_al is not initialized */ d_addr_al.size =3D 0; /* To indicate d_addr_al is not initialized */ =20 @@ -526,7 +527,6 @@ int dlfilter__do_filter_event(struct dlfilter *d, ASSIGN(period); ASSIGN(weight); ASSIGN(ins_lat); - ASSIGN(p_stage_cyc); ASSIGN(transaction); ASSIGN(insn_cnt); ASSIGN(cyc_cnt); diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index 67ad4a2014bc..b13385a6068b 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -391,8 +391,6 @@ extern unsigned int proc_map_timeout; #define PAGE_SIZE_NAME_LEN 32 char *get_page_size_name(u64 size, char *str); =20 -void arch_perf_parse_sample_weight(struct perf_sample *data, const __u64 *= array, u64 type); -void arch_perf_synthesize_sample_weight(const struct perf_sample *data, __= u64 *array, u64 type); const char *arch_perf_header_entry(const char *se_header); int arch_support_sort_key(const char *sort_key); =20 diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index e4a52f4b0af0..8f1dfe53bc06 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -2867,11 +2867,18 @@ perf_event__check_size(union perf_event *event, uns= igned int sample_size) return 0; } =20 -void __weak arch_perf_parse_sample_weight(struct perf_sample *data, - const __u64 *array, - u64 type __maybe_unused) +static void perf_parse_sample_weight(struct perf_sample *data, const __u64= *array, u64 type) { - data->weight =3D *array; + union perf_sample_weight weight; + + weight.full =3D *array; + if (type & PERF_SAMPLE_WEIGHT_STRUCT) { + data->weight =3D weight.var1_dw; + data->ins_lat =3D weight.var2_w; + data->weight3 =3D weight.var3_w; + } else { + data->weight =3D weight.full; + } } =20 u64 evsel__bitfield_swap_branch_flags(u64 value) @@ -3257,7 +3264,7 @@ int evsel__parse_sample(struct evsel *evsel, union pe= rf_event *event, =20 if (type & PERF_SAMPLE_WEIGHT_TYPE) { OVERFLOW_CHECK_u64(array); - arch_perf_parse_sample_weight(data, array, type); + perf_parse_sample_weight(data, array, type); array++; } =20 diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index afc6855327ab..64ff427040c3 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -829,7 +829,7 @@ __hists__add_entry(struct hists *hists, .period =3D sample->period, .weight1 =3D sample->weight, .weight2 =3D sample->ins_lat, - .weight3 =3D sample->p_stage_cyc, + .weight3 =3D sample->weight3, .latency =3D al->latency, }, .parent =3D sym_parent, @@ -846,7 +846,7 @@ __hists__add_entry(struct hists *hists, .time =3D hist_time(sample->time), .weight =3D sample->weight, .ins_lat =3D sample->ins_lat, - .p_stage_cyc =3D sample->p_stage_cyc, + .weight3 =3D sample->weight3, .simd_flags =3D sample->simd_flags, }, *he =3D hists__findnew_entry(hists, &entry, al, sample_self); =20 diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index c64254088fc7..70438d03ca9c 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -255,7 +255,8 @@ struct hist_entry { u64 code_page_size; u64 weight; u64 ins_lat; - u64 p_stage_cyc; + /** @weight3: On x86 holds retire_lat, on powerpc holds p_stage_cyc. */ + u64 weight3; s32 socket; s32 cpu; int parallelism; diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index 3b92ebf5c112..8c9aee157ec4 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -210,8 +210,8 @@ static int process_sample_event(const struct perf_tool = *tool __maybe_unused, * latency value will be used. Save the number of samples and the sum of * retire latency value for each event. */ - t->last =3D sample->retire_lat; - update_stats(&t->stats, sample->retire_lat); + t->last =3D sample->weight3; + update_stats(&t->stats, sample->weight3); mutex_unlock(tpebs_mtx_get()); return 0; } diff --git a/tools/perf/util/sample.h b/tools/perf/util/sample.h index 0e96240052e9..fae834144ef4 100644 --- a/tools/perf/util/sample.h +++ b/tools/perf/util/sample.h @@ -104,10 +104,8 @@ struct perf_sample { u8 cpumode; u16 misc; u16 ins_lat; - union { - u16 p_stage_cyc; - u16 retire_lat; - }; + /** @weight3: On x86 holds retire_lat, on powerpc holds p_stage_cyc. */ + u16 weight3; bool no_hw_idx; /* No hw_idx collected in branch_stack */ char insn[MAX_INSN]; void *raw_data; diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 2a79e6844f36..26ae078278cd 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -1099,7 +1099,7 @@ static void dump_sample(struct evsel *evsel, union pe= rf_event *event, printf("... weight: %" PRIu64 "", sample->weight); if (sample_type & PERF_SAMPLE_WEIGHT_STRUCT) { printf(",0x%"PRIx16"", sample->ins_lat); - printf(",0x%"PRIx16"", sample->p_stage_cyc); + printf(",0x%"PRIx16"", sample->weight3); } printf("\n"); } diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 7969d64a47bf..0ba2ce1b1c07 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -1884,21 +1884,20 @@ struct sort_entry sort_global_ins_lat =3D { static int64_t sort__p_stage_cyc_cmp(struct hist_entry *left, struct hist_entry *right) { - return left->p_stage_cyc - right->p_stage_cyc; + return left->weight3 - right->weight3; } =20 static int hist_entry__global_p_stage_cyc_snprintf(struct hist_entry *he, = char *bf, size_t size, unsigned int width) { - return repsep_snprintf(bf, size, "%-*u", width, - he->p_stage_cyc * he->stat.nr_events); + return repsep_snprintf(bf, size, "%-*u", width, he->weight3 * he->stat.nr= _events); } =20 =20 static int hist_entry__p_stage_cyc_snprintf(struct hist_entry *he, char *b= f, size_t size, unsigned int width) { - return repsep_snprintf(bf, size, "%-*u", width, he->p_stage_cyc); + return repsep_snprintf(bf, size, "%-*u", width, he->weight3); } =20 struct sort_entry sort_local_p_stage_cyc =3D { diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 638d7dd7fa4b..6afdcfd14224 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -1573,10 +1573,16 @@ size_t perf_event__sample_event_size(const struct p= erf_sample *sample, u64 type, return result; } =20 -void __weak arch_perf_synthesize_sample_weight(const struct perf_sample *d= ata, +static void perf_synthesize_sample_weight(const struct perf_sample *data, __u64 *array, u64 type __maybe_unused) { *array =3D data->weight; + + if (type & PERF_SAMPLE_WEIGHT_STRUCT) { + *array &=3D 0xffffffff; + *array |=3D ((u64)data->ins_lat << 32); + *array |=3D ((u64)data->weight3 << 48); + } } =20 static __u64 *copy_read_group_values(__u64 *array, __u64 read_format, @@ -1736,7 +1742,7 @@ int perf_event__synthesize_sample(union perf_event *e= vent, u64 type, u64 read_fo } =20 if (type & PERF_SAMPLE_WEIGHT_TYPE) { - arch_perf_synthesize_sample_weight(sample, array, type); + perf_synthesize_sample_weight(sample, array, type); array++; } =20 --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:11 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AB49A2EBB89 for ; Thu, 24 Jul 2025 16:34:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374850; cv=none; b=tbhQS/0JiegJCOPmmxt5cCujHGhHa6PiicJ0T5bNxOkDybVcq/GBiG8dutrRmRPllLr1sAG5RTupZQi1nB3oNIOQwCXgNcWkaRQBxRetJDEJftlK7/D5h8jf2XgOsXt8fBI3EbYbsyj89ldTAaG7q2Vx6jR7X0BLkAVpUCnmTeI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374850; c=relaxed/simple; bh=632wKGNyCCWu4IHUHc4YCR6GE2rvG7HxdGVRhULHoEk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Gcqf4NdFdhRwOSvXGVkJPrNKRe8U+tbmUie+Dicft0Tk4XHngGCLuf/omsBR7naW2BQyR8XDu+9J/GWGUSwUTOE9dRXN+CzJBXZyY1yI+yXPeXnhRlZbmNdAl6/qYr8iq3kHrO47LTu8Tw9EWu20dTm1Zeh5qzceDHNEhdgofqQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LMeLDsM6; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LMeLDsM6" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-234fedd3e51so10890855ad.1 for ; Thu, 24 Jul 2025 09:34:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374848; x=1753979648; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=KRJnLCS3Te9ds9o18/k7NkHBfW+BQaNrKh8gUYHbrGE=; b=LMeLDsM6RV3SRh8XY/rEKhLk/VeAeUSm4QL0qCSBNLNH3GmDgbpkrmEKNgwkI/6gK2 6HDvLgThL8if3eBbS7tdH8bRp+E3HJ8NsuUDAwkoGN+B58/S9jV76oAOd3wbye2iQd8f RdOu2Cgi04IkYrqlc4nt8UioTnOPgUKHUkmaL1h2kkoByypvOZShGhD72+E4a5zAOvAj sP/aafybknrhiAjFszP3SLKav1m7NRDpIUhf4HuKkgpdHvCSdHxB/qAxNLXFPUmtuUa7 GiYXCRq0WJHDxGAhR3bRAMAyMgkcEMTuuVuPOaxHpwt1iN0GLsr9IyF0B6eJiqrmMQgf Td4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374848; x=1753979648; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=KRJnLCS3Te9ds9o18/k7NkHBfW+BQaNrKh8gUYHbrGE=; b=hbn8ofZopACnAZ/o4hFUtsbputi1M6dX9SdOYkQzMTlAKGtHuqSyjzTyxhLEaNs/gd ugcBDR6pWZ4Tkjplt5K4WFahdxqZ6pxkYgw7DLhfn/RuJwGYZBXeXfGM/be1G03TKg8F TVcmTUm3hAhaXZKSQAtlEhaOqegXf12R6V8tSeahieJPYJwMYdYTQGUItkOos0N+l6DH WKRnslexOfhJo/JYBC0tIKcUpIio+yHJbnbjcTuxuM25H1LNgINQPE2ghfe/bNo1eamR 7SX1Of9tNsXT77WF3L/9sEKrbQsvtIX1JrGMhf5YPk9/ugFMH0EBNX88ZnNvqGfNsc/B crxA== X-Forwarded-Encrypted: i=1; AJvYcCXWWXlXpzLjMle7YCrXR3SXbxIIyp1Jwcc0l79zEOqiTgsEM01Vp6UbnVMGPbVW5SJ470fpqBcK12b8fow=@vger.kernel.org X-Gm-Message-State: AOJu0Yx7hhBGHJsFf70PK4kE6yXWoO42uz7gJcny+MGxUL7AiLc4h+0V gGQM8O6bnp7FliWuj68beo06TMjd1cyRqLBv/2Eu+cfxhQxk561XOzoknOIVH0PyGAcBk4hv3C/ qwZXEPwXN5Q== X-Google-Smtp-Source: AGHT+IGUgy9kFIK3yWoxJCyX5EFX4c3T5gpyZo5qR4OS55WYFBvKkGnZSR6RTnQeMkax1xnxaEp3rD8WER6A X-Received: from plblc16.prod.google.com ([2002:a17:902:fa90:b0:236:38e1:6020]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:46ce:b0:234:c5c1:9b7a with SMTP id d9443c01a7336-23f9816414dmr86114945ad.8.1753374848004; Thu, 24 Jul 2025 09:34:08 -0700 (PDT) Date: Thu, 24 Jul 2025 09:33:01 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-22-irogers@google.com> Subject: [PATCH v6 21/22] perf test: Move PERF_SAMPLE_WEIGHT_STRUCT parsing to common test From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" test__x86_sample_parsing is identical to test__sample_parsing except it explicitly tested PERF_SAMPLE_WEIGHT_STRUCT. Now the parsing code is common move the PERF_SAMPLE_WEIGHT_STRUCT to the common sample parsing test and remove the x86 version. Signed-off-by: Ian Rogers --- tools/perf/arch/x86/include/arch-tests.h | 1 - tools/perf/arch/x86/tests/Build | 1 - tools/perf/arch/x86/tests/arch-tests.c | 2 - tools/perf/arch/x86/tests/sample-parsing.c | 125 --------------------- tools/perf/tests/sample-parsing.c | 14 +++ 5 files changed, 14 insertions(+), 129 deletions(-) delete mode 100644 tools/perf/arch/x86/tests/sample-parsing.c diff --git a/tools/perf/arch/x86/include/arch-tests.h b/tools/perf/arch/x86= /include/arch-tests.h index 4fd425157d7d..957934417b26 100644 --- a/tools/perf/arch/x86/include/arch-tests.h +++ b/tools/perf/arch/x86/include/arch-tests.h @@ -12,7 +12,6 @@ int test__insn_x86(struct test_suite *test, int subtest); int test__intel_pt_pkt_decoder(struct test_suite *test, int subtest); int test__intel_pt_hybrid_compat(struct test_suite *test, int subtest); int test__bp_modify(struct test_suite *test, int subtest); -int test__x86_sample_parsing(struct test_suite *test, int subtest); int test__amd_ibs_via_core_pmu(struct test_suite *test, int subtest); int test__amd_ibs_period(struct test_suite *test, int subtest); int test__hybrid(struct test_suite *test, int subtest); diff --git a/tools/perf/arch/x86/tests/Build b/tools/perf/arch/x86/tests/Bu= ild index 01d5527f38c7..01c22ca6f2bd 100644 --- a/tools/perf/arch/x86/tests/Build +++ b/tools/perf/arch/x86/tests/Build @@ -2,7 +2,6 @@ perf-test-$(CONFIG_DWARF_UNWIND) +=3D regs_load.o perf-test-$(CONFIG_DWARF_UNWIND) +=3D dwarf-unwind.o =20 perf-test-y +=3D arch-tests.o -perf-test-y +=3D sample-parsing.o perf-test-y +=3D hybrid.o perf-test-$(CONFIG_AUXTRACE) +=3D intel-pt-test.o ifeq ($(CONFIG_EXTRA_TESTS),y) diff --git a/tools/perf/arch/x86/tests/arch-tests.c b/tools/perf/arch/x86/t= ests/arch-tests.c index bfee2432515b..1023c83684ce 100644 --- a/tools/perf/arch/x86/tests/arch-tests.c +++ b/tools/perf/arch/x86/tests/arch-tests.c @@ -23,7 +23,6 @@ struct test_suite suite__intel_pt =3D { #if defined(__x86_64__) DEFINE_SUITE("x86 bp modify", bp_modify); #endif -DEFINE_SUITE("x86 Sample parsing", x86_sample_parsing); DEFINE_SUITE("AMD IBS via core pmu", amd_ibs_via_core_pmu); DEFINE_SUITE_EXCLUSIVE("AMD IBS sample period", amd_ibs_period); static struct test_case hybrid_tests[] =3D { @@ -49,7 +48,6 @@ struct test_suite *arch_tests[] =3D { #if defined(__x86_64__) &suite__bp_modify, #endif - &suite__x86_sample_parsing, &suite__amd_ibs_via_core_pmu, &suite__amd_ibs_period, &suite__hybrid, diff --git a/tools/perf/arch/x86/tests/sample-parsing.c b/tools/perf/arch/x= 86/tests/sample-parsing.c deleted file mode 100644 index 22feec23e53d..000000000000 --- a/tools/perf/arch/x86/tests/sample-parsing.c +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -#include -#include -#include -#include -#include -#include -#include - -#include "event.h" -#include "evsel.h" -#include "debug.h" -#include "util/sample.h" -#include "util/synthetic-events.h" - -#include "tests/tests.h" -#include "arch-tests.h" - -#define COMP(m) do { \ - if (s1->m !=3D s2->m) { \ - pr_debug("Samples differ at '"#m"'\n"); \ - return false; \ - } \ -} while (0) - -static bool samples_same(const struct perf_sample *s1, - const struct perf_sample *s2, - u64 type) -{ - if (type & PERF_SAMPLE_WEIGHT_STRUCT) { - COMP(ins_lat); - COMP(weight3); - } - - return true; -} - -static int do_test(u64 sample_type) -{ - struct evsel evsel =3D { - .needs_swap =3D false, - .core =3D { - . attr =3D { - .sample_type =3D sample_type, - .read_format =3D 0, - }, - }, - }; - union perf_event *event; - struct perf_sample sample =3D { - .weight =3D 101, - .ins_lat =3D 102, - .weight3 =3D 103, - }; - struct perf_sample sample_out; - size_t i, sz, bufsz; - int err, ret =3D -1; - - sz =3D perf_event__sample_event_size(&sample, sample_type, 0); - bufsz =3D sz + 4096; /* Add a bit for overrun checking */ - event =3D malloc(bufsz); - if (!event) { - pr_debug("malloc failed\n"); - return -1; - } - - memset(event, 0xff, bufsz); - event->header.type =3D PERF_RECORD_SAMPLE; - event->header.misc =3D 0; - event->header.size =3D sz; - - err =3D perf_event__synthesize_sample(event, sample_type, 0, &sample); - if (err) { - pr_debug("%s failed for sample_type %#"PRIx64", error %d\n", - "perf_event__synthesize_sample", sample_type, err); - goto out_free; - } - - /* The data does not contain 0xff so we use that to check the size */ - for (i =3D bufsz; i > 0; i--) { - if (*(i - 1 + (u8 *)event) !=3D 0xff) - break; - } - if (i !=3D sz) { - pr_debug("Event size mismatch: actual %zu vs expected %zu\n", - i, sz); - goto out_free; - } - - evsel.sample_size =3D __evsel__sample_size(sample_type); - - err =3D evsel__parse_sample(&evsel, event, &sample_out); - if (err) { - pr_debug("%s failed for sample_type %#"PRIx64", error %d\n", - "evsel__parse_sample", sample_type, err); - goto out_free; - } - - if (!samples_same(&sample, &sample_out, sample_type)) { - pr_debug("parsing failed for sample_type %#"PRIx64"\n", - sample_type); - goto out_free; - } - - ret =3D 0; -out_free: - free(event); - - return ret; -} - -/** - * test__x86_sample_parsing - test X86 specific sample parsing - * - * This function implements a test that synthesizes a sample event, parses= it - * and then checks that the parsed sample matches the original sample. If = the - * test passes %0 is returned, otherwise %-1 is returned. - * - * For now, the PERF_SAMPLE_WEIGHT_STRUCT is the only X86 specific sample = type. - * The test only checks the PERF_SAMPLE_WEIGHT_STRUCT type. - */ -int test__x86_sample_parsing(struct test_suite *test __maybe_unused, int s= ubtest __maybe_unused) -{ - return do_test(PERF_SAMPLE_WEIGHT_STRUCT); -} diff --git a/tools/perf/tests/sample-parsing.c b/tools/perf/tests/sample-pa= rsing.c index 72411580f869..a7327c942ca2 100644 --- a/tools/perf/tests/sample-parsing.c +++ b/tools/perf/tests/sample-parsing.c @@ -152,6 +152,12 @@ static bool samples_same(struct perf_sample *s1, if (type & PERF_SAMPLE_WEIGHT) COMP(weight); =20 + if (type & PERF_SAMPLE_WEIGHT_STRUCT) { + COMP(weight); + COMP(ins_lat); + COMP(weight3); + } + if (type & PERF_SAMPLE_DATA_SRC) COMP(data_src); =20 @@ -269,6 +275,8 @@ static int do_test(u64 sample_type, u64 sample_regs, u6= 4 read_format) .cgroup =3D 114, .data_page_size =3D 115, .code_page_size =3D 116, + .ins_lat =3D 117, + .weight3 =3D 118, .aux_sample =3D { .size =3D sizeof(aux_data), .data =3D (void *)aux_data, @@ -439,6 +447,12 @@ static int test__sample_parsing(struct test_suite *tes= t __maybe_unused, int subt if (err) return err; } + sample_type =3D (PERF_SAMPLE_MAX - 1) & ~PERF_SAMPLE_WEIGHT_STRUCT; + for (i =3D 0; i < ARRAY_SIZE(rf); i++) { + err =3D do_test(sample_type, sample_regs, rf[i]); + if (err) + return err; + } =20 return 0; } --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Mon Oct 6 04:57:11 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A5C9B2EFDA7 for ; Thu, 24 Jul 2025 16:34:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374853; cv=none; b=MoGhXdyG+PIojTYJ9NzWSOpGn71qjy5fUi9XSYr3xEmbyf6Qa+hFN/iPNZh81oE3It0gFPP8aX9NgaGzVLTVxqIj0AB7n9LttLCh3FQySehCy6eVBCtk8gSKf18r3DrNMWcYBCPbAX1DUo6hlDQuc2lKND3IAbTNbLN28TQgkeI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753374853; c=relaxed/simple; bh=qGuKnaZL+N/r8vqRFpRvTvbEl4uXOr+N/Bhk9qQoixs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=YaXbtTZ8nOK2TIErKOucGoosyAqjcicuaTHJoO3s0vMiDXwljW8BwFwuhVWcBYwDicAwvW0R8cQvL4mAkcSQTfDKMmBOoB/jekfCX9sud2ouzWb5JMHGm/tfq+ujk+TLQSxqAdHjji6fi9ffTEzOj2TovnzeScfhBualHYufJYg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=3C4YzayD; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="3C4YzayD" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-74ea5d9982cso1076766b3a.2 for ; Thu, 24 Jul 2025 09:34:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1753374851; x=1753979651; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=YvpJGPGwgB5N1AR3+Ovj2L30sGdRNuf2OJi0K2MhjdY=; b=3C4YzayDbyhdvhABDka+yie4zwOKniHLEAwbr3zkTjvTXkSIEboV+RLgQsglaAmsTw eInxh5KduR7F3R6BsnabOc/JBPgPnGuhPDJjdAiO2fhZvOT5cLyb7R8lQByb1Z/sdUGw tHiTQKlrv/dZf/bYoFH0/21q6hbweTTbR1inJ7hR37G6McQYdSxu0HY9NwC17jPrJl9Z tGXyqec4hmjV5cT3v3o4F3hJRAfY+XFs1HnxCi0XtOzG6faoor6P8qoK9jO3vLbm/CGa NIbCrqgbuonNI9PHsxJR3z2lLrRiZvON+ucSudSycHxi0rIqnoQHUkDgjuyde87JIsLW e5AQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753374851; x=1753979651; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YvpJGPGwgB5N1AR3+Ovj2L30sGdRNuf2OJi0K2MhjdY=; b=eosaOfHmxpi+IlIFXY/hiWXOCk7bbn9pM6KlKriwZ+/N2KLXuXJdiULoLKBJhAl4Cc oyQuR135gt7r7B2xl/FtEzlTBXqpl+2jEXVW4YRlt5V+As0Q4Od6rENgIGZMT95YYnAl wAPaOqWaLJpO4mIbbTpTr4yH/H5fU+W5euosJXFfdlkqXcFGvaRzEAHLX4fXRCBY/S2x uPeGUMUG5GdEJU70A43thRZX3j+K11gEemlSumftHe5G0CHpZrRQmczvJcp3AJvbdK97 BwlXvz/KtUlMOtt1dGIEmXHHN+mMYUHq1J/8t0Y6mZ5lb3An4v1az5V3dp7zG/Qk4VxE ybsQ== X-Forwarded-Encrypted: i=1; AJvYcCXJYige6ogBMCuctCQkfb3MMxAA2bpL3inVp9VB0g3+zsyeWuEOTmEcHHzu5xnc+WRQmPWBQC449rBbfRk=@vger.kernel.org X-Gm-Message-State: AOJu0YyWOwdmsxSYSx0GYBhProZpzJc2ri0zygCibqISegqF/k4vQZcB x3DF3G2/j61XWsGLZZFr6okvpYulD3Xchz7UxDf+EyyDPPDFIqHhCotsfndpb3QwKuCLFbyOltV 8sU+YOY2Ixg== X-Google-Smtp-Source: AGHT+IE8Gu9lWGoQu1YyYSOvQGVXR32cKGsSMPkW4wXXKqxK2csuLD+gOJ1Uv7hnC8quUrcHdty3kFbTKMts X-Received: from pfbli5.prod.google.com ([2002:a05:6a00:7185:b0:74b:41c0:e916]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:188e:b0:758:b81:603a with SMTP id d2e1a72fcca58-76034c002d2mr10592703b3a.2.1753374850134; Thu, 24 Jul 2025 09:34:10 -0700 (PDT) Date: Thu, 24 Jul 2025 09:33:02 -0700 In-Reply-To: <20250724163302.596743-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250724163302.596743-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250724163302.596743-23-irogers@google.com> Subject: [PATCH v6 22/22] perf sort: Use perf_env to set arch sort keys and header From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , "Masami Hiramatsu (Google)" , Ravi Bangoria , Charlie Jenkins , Colin Ian King , Andi Kleen , Dmitry Vyukov , Graham Woodward , Ilkka Koskinen , Zhongqiu Han , Yicong Yang , Athira Rajeev , Kajol Jain , Li Huafei , "Steinar H. Gunderson" , Stephen Brennan , Chun-Tse Shao , Yujie Liu , "Dr. David Alan Gilbert" , Levi Yun , Howard Chu , Weilin Wang , Thomas Falcon , Matt Fleming , "=?UTF-8?q?Krzysztof=20=C5=81opatowski?=" , Zixian Cai , Steve Clevenger , Ben Gainey , Chaitanya S Prakash , Martin Liska , "=?UTF-8?q?Martin=20Li=C5=A1ka?=" , Song Liu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Previously arch_support_sort_key and arch_perf_header_entry used a weak symbol to compile as appropriate for x86 and powerpc. A limitation to this is that the handling of a data file could vary in cross-platform development. Change to using the perf_env of the current session to determine the architecture kind and set the sort key and header entries as appropriate. Signed-off-by: Ian Rogers --- tools/perf/arch/powerpc/util/Build | 1 - tools/perf/arch/powerpc/util/event.c | 34 ---------------- tools/perf/arch/x86/util/event.c | 19 --------- tools/perf/builtin-annotate.c | 2 +- tools/perf/builtin-c2c.c | 53 +++++++++++++----------- tools/perf/builtin-diff.c | 2 +- tools/perf/builtin-report.c | 2 +- tools/perf/builtin-top.c | 22 +++++----- tools/perf/tests/hists_cumulate.c | 8 ++-- tools/perf/tests/hists_filter.c | 8 ++-- tools/perf/tests/hists_link.c | 8 ++-- tools/perf/tests/hists_output.c | 10 ++--- tools/perf/util/event.h | 3 -- tools/perf/util/sort.c | 61 ++++++++++++++++++++-------- tools/perf/util/sort.h | 5 ++- 15 files changed, 107 insertions(+), 131 deletions(-) delete mode 100644 tools/perf/arch/powerpc/util/event.c diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/u= til/Build index ed82715080f9..fdd6a77a3432 100644 --- a/tools/perf/arch/powerpc/util/Build +++ b/tools/perf/arch/powerpc/util/Build @@ -5,7 +5,6 @@ perf-util-y +=3D mem-events.o perf-util-y +=3D pmu.o perf-util-y +=3D sym-handling.o perf-util-y +=3D evsel.o -perf-util-y +=3D event.o =20 perf-util-$(CONFIG_LIBDW) +=3D skip-callchain-idx.o =20 diff --git a/tools/perf/arch/powerpc/util/event.c b/tools/perf/arch/powerpc= /util/event.c deleted file mode 100644 index 024ac8b54c33..000000000000 --- a/tools/perf/arch/powerpc/util/event.c +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include -#include - -#include "../../../util/event.h" -#include "../../../util/synthetic-events.h" -#include "../../../util/machine.h" -#include "../../../util/tool.h" -#include "../../../util/map.h" -#include "../../../util/debug.h" -#include "../../../util/sample.h" - -const char *arch_perf_header_entry(const char *se_header) -{ - if (!strcmp(se_header, "Local INSTR Latency")) - return "Finish Cyc"; - else if (!strcmp(se_header, "INSTR Latency")) - return "Global Finish_cyc"; - else if (!strcmp(se_header, "Local Pipeline Stage Cycle")) - return "Dispatch Cyc"; - else if (!strcmp(se_header, "Pipeline Stage Cycle")) - return "Global Dispatch_cyc"; - return se_header; -} - -int arch_support_sort_key(const char *sort_key) -{ - if (!strcmp(sort_key, "p_stage_cyc")) - return 1; - if (!strcmp(sort_key, "local_p_stage_cyc")) - return 1; - return 0; -} diff --git a/tools/perf/arch/x86/util/event.c b/tools/perf/arch/x86/util/ev= ent.c index 576c1c36046c..3cd384317739 100644 --- a/tools/perf/arch/x86/util/event.c +++ b/tools/perf/arch/x86/util/event.c @@ -91,22 +91,3 @@ int perf_event__synthesize_extra_kmaps(const struct perf= _tool *tool, } =20 #endif - -const char *arch_perf_header_entry(const char *se_header) -{ - if (!strcmp(se_header, "Local Pipeline Stage Cycle")) - return "Local Retire Latency"; - else if (!strcmp(se_header, "Pipeline Stage Cycle")) - return "Retire Latency"; - - return se_header; -} - -int arch_support_sort_key(const char *sort_key) -{ - if (!strcmp(sort_key, "p_stage_cyc")) - return 1; - if (!strcmp(sort_key, "local_p_stage_cyc")) - return 1; - return 0; -} diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 326593862998..5d57d2913f3d 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -947,7 +947,7 @@ int cmd_annotate(int argc, const char **argv) annotate_opts.show_br_cntr =3D true; } =20 - if (setup_sorting(NULL) < 0) + if (setup_sorting(/*evlist=3D*/NULL, perf_session__env(annotate.session))= < 0) usage_with_options(annotate_usage, options); =20 ret =3D __cmd_annotate(&annotate); diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index 8cb36d9433f8..9e9ff471ddd1 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -195,12 +195,14 @@ static struct hist_entry_ops c2c_entry_ops =3D { =20 static int c2c_hists__init(struct c2c_hists *hists, const char *sort, - int nr_header_lines); + int nr_header_lines, + struct perf_env *env); =20 static struct c2c_hists* he__get_c2c_hists(struct hist_entry *he, const char *sort, - int nr_header_lines) + int nr_header_lines, + struct perf_env *env) { struct c2c_hist_entry *c2c_he; struct c2c_hists *hists; @@ -214,7 +216,7 @@ he__get_c2c_hists(struct hist_entry *he, if (!hists) return NULL; =20 - ret =3D c2c_hists__init(hists, sort, nr_header_lines); + ret =3D c2c_hists__init(hists, sort, nr_header_lines, env); if (ret) { free(hists); return NULL; @@ -350,7 +352,7 @@ static int process_sample_event(const struct perf_tool = *tool __maybe_unused, =20 mi =3D mi_dup; =20 - c2c_hists =3D he__get_c2c_hists(he, c2c.cl_sort, 2); + c2c_hists =3D he__get_c2c_hists(he, c2c.cl_sort, 2, machine->env); if (!c2c_hists) goto free_mi; =20 @@ -1966,7 +1968,8 @@ static struct c2c_fmt *get_format(const char *name) return c2c_fmt; } =20 -static int c2c_hists__init_output(struct perf_hpp_list *hpp_list, char *na= me) +static int c2c_hists__init_output(struct perf_hpp_list *hpp_list, char *na= me, + struct perf_env *env __maybe_unused) { struct c2c_fmt *c2c_fmt =3D get_format(name); int level =3D 0; @@ -1980,14 +1983,14 @@ static int c2c_hists__init_output(struct perf_hpp_l= ist *hpp_list, char *name) return 0; } =20 -static int c2c_hists__init_sort(struct perf_hpp_list *hpp_list, char *name) +static int c2c_hists__init_sort(struct perf_hpp_list *hpp_list, char *name= , struct perf_env *env) { struct c2c_fmt *c2c_fmt =3D get_format(name); struct c2c_dimension *dim; =20 if (!c2c_fmt) { reset_dimensions(); - return sort_dimension__add(hpp_list, name, NULL, 0); + return sort_dimension__add(hpp_list, name, /*evlist=3D*/NULL, env, /*lev= el=3D*/0); } =20 dim =3D c2c_fmt->dim; @@ -2008,7 +2011,7 @@ static int c2c_hists__init_sort(struct perf_hpp_list = *hpp_list, char *name) \ for (tok =3D strtok_r((char *)_list, ", ", &tmp); \ tok; tok =3D strtok_r(NULL, ", ", &tmp)) { \ - ret =3D _fn(hpp_list, tok); \ + ret =3D _fn(hpp_list, tok, env); \ if (ret =3D=3D -EINVAL) { \ pr_err("Invalid --fields key: `%s'", tok); \ break; \ @@ -2021,7 +2024,8 @@ static int c2c_hists__init_sort(struct perf_hpp_list = *hpp_list, char *name) =20 static int hpp_list__parse(struct perf_hpp_list *hpp_list, const char *output_, - const char *sort_) + const char *sort_, + struct perf_env *env) { char *output =3D output_ ? strdup(output_) : NULL; char *sort =3D sort_ ? strdup(sort_) : NULL; @@ -2052,7 +2056,8 @@ static int hpp_list__parse(struct perf_hpp_list *hpp_= list, =20 static int c2c_hists__init(struct c2c_hists *hists, const char *sort, - int nr_header_lines) + int nr_header_lines, + struct perf_env *env) { __hists__init(&hists->hists, &hists->list); =20 @@ -2066,15 +2071,16 @@ static int c2c_hists__init(struct c2c_hists *hists, /* Overload number of header lines.*/ hists->list.nr_header_lines =3D nr_header_lines; =20 - return hpp_list__parse(&hists->list, NULL, sort); + return hpp_list__parse(&hists->list, /*output=3D*/NULL, sort, env); } =20 static int c2c_hists__reinit(struct c2c_hists *c2c_hists, const char *output, - const char *sort) + const char *sort, + struct perf_env *env) { perf_hpp__reset_output_field(&c2c_hists->list); - return hpp_list__parse(&c2c_hists->list, output, sort); + return hpp_list__parse(&c2c_hists->list, output, sort, env); } =20 #define DISPLAY_LINE_LIMIT 0.001 @@ -2207,8 +2213,9 @@ static int filter_cb(struct hist_entry *he, void *arg= __maybe_unused) return 0; } =20 -static int resort_cl_cb(struct hist_entry *he, void *arg __maybe_unused) +static int resort_cl_cb(struct hist_entry *he, void *arg) { + struct perf_env *env =3D arg; struct c2c_hist_entry *c2c_he; struct c2c_hists *c2c_hists; bool display =3D he__display(he, &c2c.shared_clines_stats); @@ -2222,7 +2229,7 @@ static int resort_cl_cb(struct hist_entry *he, void *= arg __maybe_unused) c2c_he->cacheline_idx =3D idx++; calc_width(c2c_he); =20 - c2c_hists__reinit(c2c_hists, c2c.cl_output, c2c.cl_resort); + c2c_hists__reinit(c2c_hists, c2c.cl_output, c2c.cl_resort, env); =20 hists__collapse_resort(&c2c_hists->hists, NULL); hists__output_resort_cb(&c2c_hists->hists, NULL, filter_cb); @@ -2334,7 +2341,7 @@ static int resort_shared_cl_cb(struct hist_entry *he,= void *arg __maybe_unused) return 0; } =20 -static int hists__iterate_cb(struct hists *hists, hists__resort_cb_t cb) +static int hists__iterate_cb(struct hists *hists, hists__resort_cb_t cb, v= oid *arg) { struct rb_node *next =3D rb_first_cached(&hists->entries); int ret =3D 0; @@ -2343,7 +2350,7 @@ static int hists__iterate_cb(struct hists *hists, his= ts__resort_cb_t cb) struct hist_entry *he; =20 he =3D rb_entry(next, struct hist_entry, rb_node); - ret =3D cb(he, NULL); + ret =3D cb(he, arg); if (ret) break; next =3D rb_next(&he->rb_node); @@ -2449,7 +2456,7 @@ static void print_cacheline(struct c2c_hists *c2c_his= ts, hists__fprintf(&c2c_hists->hists, false, 0, 0, 0, out, false); } =20 -static void print_pareto(FILE *out) +static void print_pareto(FILE *out, struct perf_env *env) { struct perf_hpp_list hpp_list; struct rb_node *nd; @@ -2474,7 +2481,7 @@ static void print_pareto(FILE *out) "dcacheline"; =20 perf_hpp_list__init(&hpp_list); - ret =3D hpp_list__parse(&hpp_list, cl_output, NULL); + ret =3D hpp_list__parse(&hpp_list, cl_output, /*evlist=3D*/NULL, env); =20 if (WARN_ONCE(ret, "failed to setup sort entries\n")) return; @@ -2539,7 +2546,7 @@ static void perf_c2c__hists_fprintf(FILE *out, struct= perf_session *session) fprintf(out, "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D\n"); fprintf(out, "#\n"); =20 - print_pareto(out); + print_pareto(out, perf_session__env(session)); } =20 #ifdef HAVE_SLANG_SUPPORT @@ -3097,7 +3104,7 @@ static int perf_c2c__report(int argc, const char **ar= gv) goto out_session; } =20 - err =3D c2c_hists__init(&c2c.hists, "dcacheline", 2); + err =3D c2c_hists__init(&c2c.hists, "dcacheline", 2, perf_session__env(se= ssion)); if (err) { pr_debug("Failed to initialize hists\n"); goto out_session; @@ -3181,13 +3188,13 @@ static int perf_c2c__report(int argc, const char **= argv) else if (c2c.display =3D=3D DISPLAY_SNP_PEER) sort_str =3D "tot_peer"; =20 - c2c_hists__reinit(&c2c.hists, output_str, sort_str); + c2c_hists__reinit(&c2c.hists, output_str, sort_str, perf_session__env(ses= sion)); =20 ui_progress__init(&prog, c2c.hists.hists.nr_entries, "Sorting..."); =20 hists__collapse_resort(&c2c.hists.hists, NULL); hists__output_resort_cb(&c2c.hists.hists, &prog, resort_shared_cl_cb); - hists__iterate_cb(&c2c.hists.hists, resort_cl_cb); + hists__iterate_cb(&c2c.hists.hists, resort_cl_cb, perf_session__env(sessi= on)); =20 ui_progress__finish(); =20 diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index ae490d58af92..53d5ea4a6a4f 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -2003,7 +2003,7 @@ int cmd_diff(int argc, const char **argv) sort__mode =3D SORT_MODE__DIFF; } =20 - if (setup_sorting(NULL) < 0) + if (setup_sorting(/*evlist=3D*/NULL, perf_session__env(data__files[0].ses= sion)) < 0) usage_with_options(diff_usage, options); =20 setup_pager(); diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index ada8e0166c78..35df04dad2fd 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1790,7 +1790,7 @@ int cmd_report(int argc, const char **argv) } =20 if ((last_key !=3D K_SWITCH_INPUT_DATA && last_key !=3D K_RELOAD) && - (setup_sorting(session->evlist) < 0)) { + (setup_sorting(session->evlist, perf_session__env(session)) < 0)) { if (sort_order) parse_options_usage(report_usage, options, "s", 1); if (field_order) diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index e9743f17bd0c..a11f629c7d76 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1767,7 +1767,17 @@ int cmd_top(int argc, const char **argv) =20 setup_browser(false); =20 - if (setup_sorting(top.evlist) < 0) { + top.session =3D __perf_session__new(/*data=3D*/NULL, /*tool=3D*/NULL, + /*trace_event_repipe=3D*/false, + &host_env); + if (IS_ERR(top.session)) { + status =3D PTR_ERR(top.session); + top.session =3D NULL; + goto out_delete_evlist; + } + top.evlist->session =3D top.session; + + if (setup_sorting(top.evlist, perf_session__env(top.session)) < 0) { if (sort_order) parse_options_usage(top_usage, options, "s", 1); if (field_order) @@ -1842,16 +1852,6 @@ int cmd_top(int argc, const char **argv) signal(SIGWINCH, winch_sig); } =20 - top.session =3D __perf_session__new(/*data=3D*/NULL, /*tool=3D*/NULL, - /*trace_event_repipe=3D*/false, - &host_env); - if (IS_ERR(top.session)) { - status =3D PTR_ERR(top.session); - top.session =3D NULL; - goto out_delete_evlist; - } - top.evlist->session =3D top.session; - if (!evlist__needs_bpf_sb_event(top.evlist)) top.record_opts.no_bpf_event =3D true; =20 diff --git a/tools/perf/tests/hists_cumulate.c b/tools/perf/tests/hists_cum= ulate.c index 1e0f5a310fd5..3eb9ef8d7ec6 100644 --- a/tools/perf/tests/hists_cumulate.c +++ b/tools/perf/tests/hists_cumulate.c @@ -295,7 +295,7 @@ static int test1(struct evsel *evsel, struct machine *m= achine) symbol_conf.cumulate_callchain =3D false; evsel__reset_sample_bit(evsel, CALLCHAIN); =20 - setup_sorting(NULL); + setup_sorting(/*evlist=3D*/NULL, machine->env); callchain_register_param(&callchain_param); =20 err =3D add_hist_entries(hists, machine); @@ -442,7 +442,7 @@ static int test2(struct evsel *evsel, struct machine *m= achine) symbol_conf.cumulate_callchain =3D false; evsel__set_sample_bit(evsel, CALLCHAIN); =20 - setup_sorting(NULL); + setup_sorting(/*evlist=3D*/NULL, machine->env); callchain_register_param(&callchain_param); =20 err =3D add_hist_entries(hists, machine); @@ -500,7 +500,7 @@ static int test3(struct evsel *evsel, struct machine *m= achine) symbol_conf.cumulate_callchain =3D true; evsel__reset_sample_bit(evsel, CALLCHAIN); =20 - setup_sorting(NULL); + setup_sorting(/*evlist=3D*/NULL, machine->env); callchain_register_param(&callchain_param); =20 err =3D add_hist_entries(hists, machine); @@ -684,7 +684,7 @@ static int test4(struct evsel *evsel, struct machine *m= achine) symbol_conf.cumulate_callchain =3D true; evsel__set_sample_bit(evsel, CALLCHAIN); =20 - setup_sorting(NULL); + setup_sorting(/*evlist=3D*/NULL, machine->env); =20 callchain_param =3D callchain_param_default; callchain_register_param(&callchain_param); diff --git a/tools/perf/tests/hists_filter.c b/tools/perf/tests/hists_filte= r.c index 4b2e4f2fbe48..1cebd20cc91c 100644 --- a/tools/perf/tests/hists_filter.c +++ b/tools/perf/tests/hists_filter.c @@ -131,10 +131,6 @@ static int test__hists_filter(struct test_suite *test = __maybe_unused, int subtes goto out; err =3D TEST_FAIL; =20 - /* default sort order (comm,dso,sym) will be used */ - if (setup_sorting(NULL) < 0) - goto out; - machines__init(&machines); =20 /* setup threads/dso/map/symbols also */ @@ -145,6 +141,10 @@ static int test__hists_filter(struct test_suite *test = __maybe_unused, int subtes if (verbose > 1) machine__fprintf(machine, stderr); =20 + /* default sort order (comm,dso,sym) will be used */ + if (setup_sorting(evlist, machine->env) < 0) + goto out; + /* process sample events */ err =3D add_hist_entries(evlist, machine); if (err < 0) diff --git a/tools/perf/tests/hists_link.c b/tools/perf/tests/hists_link.c index 5b6f1e883466..996f5f0b3bd1 100644 --- a/tools/perf/tests/hists_link.c +++ b/tools/perf/tests/hists_link.c @@ -303,10 +303,6 @@ static int test__hists_link(struct test_suite *test __= maybe_unused, int subtest goto out; =20 err =3D TEST_FAIL; - /* default sort order (comm,dso,sym) will be used */ - if (setup_sorting(NULL) < 0) - goto out; - machines__init(&machines); =20 /* setup threads/dso/map/symbols also */ @@ -317,6 +313,10 @@ static int test__hists_link(struct test_suite *test __= maybe_unused, int subtest if (verbose > 1) machine__fprintf(machine, stderr); =20 + /* default sort order (comm,dso,sym) will be used */ + if (setup_sorting(evlist, machine->env) < 0) + goto out; + /* process sample events */ err =3D add_hist_entries(evlist, machine); if (err < 0) diff --git a/tools/perf/tests/hists_output.c b/tools/perf/tests/hists_outpu= t.c index 33b5cc8352a7..ee5ec8bda60e 100644 --- a/tools/perf/tests/hists_output.c +++ b/tools/perf/tests/hists_output.c @@ -146,7 +146,7 @@ static int test1(struct evsel *evsel, struct machine *m= achine) field_order =3D NULL; sort_order =3D NULL; /* equivalent to sort_order =3D "comm,dso,sym" */ =20 - setup_sorting(NULL); + setup_sorting(/*evlist=3D*/NULL, machine->env); =20 /* * expected output: @@ -248,7 +248,7 @@ static int test2(struct evsel *evsel, struct machine *m= achine) field_order =3D "overhead,cpu"; sort_order =3D "pid"; =20 - setup_sorting(NULL); + setup_sorting(/*evlist=3D*/NULL, machine->env); =20 /* * expected output: @@ -304,7 +304,7 @@ static int test3(struct evsel *evsel, struct machine *m= achine) field_order =3D "comm,overhead,dso"; sort_order =3D NULL; =20 - setup_sorting(NULL); + setup_sorting(/*evlist=3D*/NULL, machine->env); =20 /* * expected output: @@ -378,7 +378,7 @@ static int test4(struct evsel *evsel, struct machine *m= achine) field_order =3D "dso,sym,comm,overhead,dso"; sort_order =3D "sym"; =20 - setup_sorting(NULL); + setup_sorting(/*evlist=3D*/NULL, machine->env); =20 /* * expected output: @@ -480,7 +480,7 @@ static int test5(struct evsel *evsel, struct machine *m= achine) field_order =3D "cpu,pid,comm,dso,sym"; sort_order =3D "dso,pid"; =20 - setup_sorting(NULL); + setup_sorting(/*evlist=3D*/NULL, machine->env); =20 /* * expected output: diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index b13385a6068b..e40d16d3246c 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -391,9 +391,6 @@ extern unsigned int proc_map_timeout; #define PAGE_SIZE_NAME_LEN 32 char *get_page_size_name(u64 size, char *str); =20 -const char *arch_perf_header_entry(const char *se_header); -int arch_support_sort_key(const char *sort_key); - static inline bool perf_event_header__cpumode_is_guest(u8 cpumode) { return cpumode =3D=3D PERF_RECORD_MISC_GUEST_KERNEL || diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 0ba2ce1b1c07..f3a565b0e230 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -2530,19 +2530,44 @@ struct sort_dimension { int taken; }; =20 -int __weak arch_support_sort_key(const char *sort_key __maybe_unused) +static int arch_support_sort_key(const char *sort_key, struct perf_env *en= v) { + const char *arch =3D perf_env__arch(env); + + if (!strcmp("x86", arch) || !strcmp("powerpc", arch)) { + if (!strcmp(sort_key, "p_stage_cyc")) + return 1; + if (!strcmp(sort_key, "local_p_stage_cyc")) + return 1; + } return 0; } =20 -const char * __weak arch_perf_header_entry(const char *se_header) -{ +static const char *arch_perf_header_entry(const char *se_header, struct pe= rf_env *env) +{ + const char *arch =3D perf_env__arch(env); + + if (!strcmp("x86", arch)) { + if (!strcmp(se_header, "Local Pipeline Stage Cycle")) + return "Local Retire Latency"; + else if (!strcmp(se_header, "Pipeline Stage Cycle")) + return "Retire Latency"; + } else if (!strcmp("powerpc", arch)) { + if (!strcmp(se_header, "Local INSTR Latency")) + return "Finish Cyc"; + else if (!strcmp(se_header, "INSTR Latency")) + return "Global Finish_cyc"; + else if (!strcmp(se_header, "Local Pipeline Stage Cycle")) + return "Dispatch Cyc"; + else if (!strcmp(se_header, "Pipeline Stage Cycle")) + return "Global Dispatch_cyc"; + } return se_header; } =20 -static void sort_dimension_add_dynamic_header(struct sort_dimension *sd) +static void sort_dimension_add_dynamic_header(struct sort_dimension *sd, s= truct perf_env *env) { - sd->entry->se_header =3D arch_perf_header_entry(sd->entry->se_header); + sd->entry->se_header =3D arch_perf_header_entry(sd->entry->se_header, env= ); } =20 #define DIM(d, n, func) [d] =3D { .name =3D n, .entry =3D &(func) } @@ -3594,7 +3619,7 @@ int hpp_dimension__add_output(unsigned col, bool impl= icit) } =20 int sort_dimension__add(struct perf_hpp_list *list, const char *tok, - struct evlist *evlist, + struct evlist *evlist, struct perf_env *env, int level) { unsigned int i, j; @@ -3607,7 +3632,7 @@ int sort_dimension__add(struct perf_hpp_list *list, c= onst char *tok, */ for (j =3D 0; j < ARRAY_SIZE(arch_specific_sort_keys); j++) { if (!strcmp(arch_specific_sort_keys[j], tok) && - !arch_support_sort_key(tok)) { + !arch_support_sort_key(tok, env)) { return 0; } } @@ -3620,7 +3645,7 @@ int sort_dimension__add(struct perf_hpp_list *list, c= onst char *tok, =20 for (j =3D 0; j < ARRAY_SIZE(dynamic_headers); j++) { if (sd->name && !strcmp(dynamic_headers[j], sd->name)) - sort_dimension_add_dynamic_header(sd); + sort_dimension_add_dynamic_header(sd, env); } =20 if (sd->entry =3D=3D &sort_parent && parent_pattern) { @@ -3716,13 +3741,13 @@ int sort_dimension__add(struct perf_hpp_list *list,= const char *tok, } =20 /* This should match with sort_dimension__add() above */ -static bool is_hpp_sort_key(const char *key) +static bool is_hpp_sort_key(const char *key, struct perf_env *env) { unsigned i; =20 for (i =3D 0; i < ARRAY_SIZE(arch_specific_sort_keys); i++) { if (!strcmp(arch_specific_sort_keys[i], key) && - !arch_support_sort_key(key)) { + !arch_support_sort_key(key, env)) { return false; } } @@ -3744,7 +3769,7 @@ static bool is_hpp_sort_key(const char *key) } =20 static int setup_sort_list(struct perf_hpp_list *list, char *str, - struct evlist *evlist) + struct evlist *evlist, struct perf_env *env) { char *tmp, *tok; int ret =3D 0; @@ -3773,7 +3798,7 @@ static int setup_sort_list(struct perf_hpp_list *list= , char *str, } =20 if (*tok) { - if (is_hpp_sort_key(tok)) { + if (is_hpp_sort_key(tok, env)) { /* keep output (hpp) sort keys in the same level */ if (prev_was_hpp) { bool next_same =3D (level =3D=3D next_level); @@ -3786,7 +3811,7 @@ static int setup_sort_list(struct perf_hpp_list *list= , char *str, prev_was_hpp =3D false; } =20 - ret =3D sort_dimension__add(list, tok, evlist, level); + ret =3D sort_dimension__add(list, tok, evlist, env, level); if (ret =3D=3D -EINVAL) { if (!cacheline_size() && !strncasecmp(tok, "dcacheline", strlen(tok))) ui__error("The \"dcacheline\" --sort key needs to know the cacheline = size and it couldn't be determined on this system"); @@ -3915,7 +3940,7 @@ static char *setup_overhead(char *keys) return keys; } =20 -static int __setup_sorting(struct evlist *evlist) +static int __setup_sorting(struct evlist *evlist, struct perf_env *env) { char *str; const char *sort_keys; @@ -3955,7 +3980,7 @@ static int __setup_sorting(struct evlist *evlist) } } =20 - ret =3D setup_sort_list(&perf_hpp_list, str, evlist); + ret =3D setup_sort_list(&perf_hpp_list, str, evlist, env); =20 free(str); return ret; @@ -4191,16 +4216,16 @@ static int __setup_output_field(void) return ret; } =20 -int setup_sorting(struct evlist *evlist) +int setup_sorting(struct evlist *evlist, struct perf_env *env) { int err; =20 - err =3D __setup_sorting(evlist); + err =3D __setup_sorting(evlist, env); if (err < 0) return err; =20 if (parent_pattern !=3D default_parent_pattern) { - err =3D sort_dimension__add(&perf_hpp_list, "parent", evlist, -1); + err =3D sort_dimension__add(&perf_hpp_list, "parent", evlist, env, -1); if (err < 0) return err; } diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index a742ab7f3c67..d7787958e06b 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h @@ -6,6 +6,7 @@ #include "hist.h" =20 struct option; +struct perf_env; =20 extern regex_t parent_regex; extern const char *sort_order; @@ -130,7 +131,7 @@ extern struct sort_entry sort_thread; =20 struct evlist; struct tep_handle; -int setup_sorting(struct evlist *evlist); +int setup_sorting(struct evlist *evlist, struct perf_env *env); int setup_output_field(void); void reset_output_field(void); void sort__setup_elide(FILE *fp); @@ -145,7 +146,7 @@ bool is_strict_order(const char *order); int hpp_dimension__add_output(unsigned col, bool implicit); void reset_dimensions(void); int sort_dimension__add(struct perf_hpp_list *list, const char *tok, - struct evlist *evlist, + struct evlist *evlist, struct perf_env *env, int level); int output_field_add(struct perf_hpp_list *list, const char *tok, int *lev= el); int64_t --=20 2.50.0.727.gbf7dc18ff4-goog