From nobody Wed Oct 8 12:49:03 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 784AF1A239D for ; Sat, 28 Jun 2025 04:50:33 +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=1751086235; cv=none; b=JR/TNm1/bYcMr2NoVv5wQmDG0Dl14hcGkrbn+zdFs62pR56wakD7gULtBP7u3UCpUrgoaalDM4uxlBA6am8C9WS5u9krX+M+PCHvjn6iCPhSajuMuQWL7ZRpVOcwRYdoA75xVeyXaAZDnIPZqbBigqBCbOpL2XnBxKRs8a2sIx4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086235; c=relaxed/simple; bh=qdkXYwZwQilwi089YMqVjrMiZV659L43XoqfQaPVoIA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=D+xz/EUx/oNv7Ua7iEOSSE8PyZThf4qA8H3EF5Wq5deN1zahL/C5Pa9pkgU9z1lySHl883Hy8VuGXO+f6G/Y7myOAHhdXvXY7C5dbooFKsWx5Z+FKCyyxXWyKq6JT49ZoIOcAxHFmD79wxNMjZ8zA8uzpngxH2Dgm5pRWSBLcfI= 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=0Yw833qF; 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="0Yw833qF" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b2c37558eccso2349132a12.1 for ; Fri, 27 Jun 2025 21:50:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086233; x=1751691033; 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=0Yw833qFrakwic99I7ZWCJNaM9YgZN0VKZ+DKX6iOaXXR24oRi9r++vx7PM+qiJ5wf 4IGC/OIMPvKg0mvzsv72hdFskelJ5lxCdMC2o0ETCFXUTHH+BGxKwoW7laEh0bq+uO1R wGvLcVUSj8Z1RZ1DpZM+ZzA4DMcC+YzAk2UYWWlSrl1EjBFkxT/EJ/8pcW8W4ctgHWxW LaWT8eRflOJAg18f929KAuFQlqrjuqu5S6fl/D6oB6MoK939gnoI0CglzlMu4h96yPGR HV6oQgklh1G4v34FcdYMTV9W4mYFME4McLjt+uaCm/5E65HxTgnYPQp8z5TdLeTzHcoq 1hBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086233; x=1751691033; 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=GiKxvgeplrwNtJWPT/Suc+9jI2hriHyiOWg6zpaAEj2WR0bL724s+vEnGCEUkYE9fx BvB4azmk9YTx5yvChCt2bjKBgXux0138J44XdyqNeY34WQJCIVWq5DeCF2NEnR70GfK9 t/eEovaxSGqMX6xvvlzLqTOxRrun5DwkRqxN9aib2fNxPo7trVghlJcusIfdFkAXBEp/ Ey9I6EKXa6Rvuzx6KoYQrQB68alERhoF11gUqz452LdtZpHRUyeBuK4EGkjo/9I44EO+ fXpaCRif9pF4yilY/xp8KnuBD1dk5GSeJ9FUkMEB2PB3b1esk+RQvNBRsDCdYyHznKhJ sVqw== X-Forwarded-Encrypted: i=1; AJvYcCW3O4oBQGWzQEG7Zdbs+VQ111niIh0eW/icrWw9kzufREx78iqoihp4A+/n/T3NOpM3OcDTgnNO0Sawlzg=@vger.kernel.org X-Gm-Message-State: AOJu0Yxl2h4Bedwlk4XG4FvB1/2AZ+WCYFwMACvdyycpMoFVAKw4GdLk ZC1mzS4k1GWsRk0T9XDdHUPJ4nR2al9d13mz34Sic/NEc6AQZNtqtTCjHKPWkLyxrb29IJSorN7 RxC30/WIjOA== X-Google-Smtp-Source: AGHT+IHzrdpNZ4XNIDdNjlsvrqmnHu6/tHgF2wIWWYBQAj1mUHX5enrK0cHOp9OGdPIH+ISvTxd9nYV2j4tA X-Received: from pfbic3.prod.google.com ([2002:a05:6a00:8a03:b0:746:2117:6f55]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:392:b0:1f5:8c05:e8f8 with SMTP id adf61e73a8af0-220a169ca84mr7170694637.25.1751086232767; Fri, 27 Jun 2025 21:50:32 -0700 (PDT) Date: Fri, 27 Jun 2025 21:49:55 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-2-irogers@google.com> Subject: [PATCH v5 01/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 Wed Oct 8 12:49:03 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 652AE1A7AE3 for ; Sat, 28 Jun 2025 04:50:37 +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=1751086238; cv=none; b=lVN6pqc3ACvn5TdF5gp+bSYRbrCU9marD0dvLgx5M49hZweGV0uAjok8IJvkYmS5ifK+q5Lt9UZ+DESo4OLwyHk9WtebkAU9m5ShXJD3L52lA9FfyRsM8kc+F4FjFGfCiTsj888Dis9MwW080kFHsHRRkt5SptP/ZQ2SuX9xCI8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086238; c=relaxed/simple; bh=6Kaw3YeDSjFMbgSGwOQqcOiX76bLmOxHdfk84Y2TCRw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=ATMalwyQXRaput7mVS1fVut5mAnO6uy/Op9ErLjJxJVwLPHXSpsAfpAWX/gJagvOHEfEAjb3cNiI7b3QQYr/9SWzOnn4XW1Hnp8LJExrIq3QNGSLJx93OnYHpvuRq35xkFYuxPNyzL985mgrtd8qrgSM7DEquOBqGuDOq3AcYoM= 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=PJ9QizWo; 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="PJ9QizWo" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b2eb60594e8so358998a12.1 for ; Fri, 27 Jun 2025 21:50:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086237; x=1751691037; 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=PJ9QizWoHEea7/SLX01bTZEjA5opFbGf1aPXoKFtYdxpvyjG4NrVM2r8jOUJTyeU7/ XAKRb3k29NBgOdP6bHDO/RYyK0JY27xAIpbqL6QY7q7QpNipmElW72qQOXqrR9W3eMVU uTQ7nTpEyMMZtlb8ecRMFaKhSZwF0IoE4eRMpI4nuDYZvgYhrpmvtCQI+rmL+AheoAF7 UzQtQk1KPMqfvtpVrUU5mM6O9Y8GqRySfG8VzPH348n3ZcnVVv0CGgrFsKuwvkqKG0dN 2bL2Ew/yk+u/mechpMPMJ2uM1fLUBhqD2kZNXtftTM54wwDbBVjVSwIqXwJHihxkTt6z /dQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086237; x=1751691037; 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=iSo513Rymdgpq62e07pOaPuaewToJPFowIf+g9oAisDeyVRhsHeooI2YVv/VvP7xPy YmKOlR9cDGBgmnbb1iML5IAY4T4tl2OSXpJ7TPSXS6hCAxaxBg9p5XvEOXA5moIZ6RxA iMmeozeVIfhjcT5C8bxQ36IF8aYpit7pkrl8rva6q6SFEjXCzL9YVY9UvKGKSrxjxlM7 CwQ8nllsE6bI09G+gmCfD198ayhKijst5++E4J2j2TU9UJRtyrgnIQvXbmu8bROMXCUw Yf8V1EMCejlOjxE5++S7iZ7xZuUuE87pQOIOgyxNxZzlc/Hd0xohcexSn93Iw2Pb4tnC mInA== X-Forwarded-Encrypted: i=1; AJvYcCUbx+kfADt8uTE/84K9zYBQZKhrCbzU/lD0f8Ekl/tVE9PmJt9Pvt7JPw091aJYi+DoTf+INDeaYWdoV2U=@vger.kernel.org X-Gm-Message-State: AOJu0YwM1TKQOMG/ChFnuJLppTFxSnUWfDrmJ2WSBl4vY1ETbT4VvM+z 91gl0mSuO5qneOgc9vlUQ0nNEiNXP6y1WciwUyGWNbabV5j/t9lJC8t1eaN+fdf1RJ9gHka3EJj fUFcnRuKZvQ== X-Google-Smtp-Source: AGHT+IGWtvZQ+GufKNFStPxwXpoFd5BmjC4KaSWX/cbvB1fYzET22HcvfVJhQ9LyAFveIqQN1HBBPDZ8vvQd X-Received: from pge19.prod.google.com ([2002:a05:6a02:2d13:b0:b31:c9e0:b48]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:3387:b0:21f:5c9d:498b with SMTP id adf61e73a8af0-220a16e3a86mr8856736637.28.1751086234602; Fri, 27 Jun 2025 21:50:34 -0700 (PDT) Date: Fri, 27 Jun 2025 21:49:56 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-3-irogers@google.com> Subject: [PATCH v5 02/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 Wed Oct 8 12:49:03 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.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 228D121FF3B for ; Sat, 28 Jun 2025 04:50:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086240; cv=none; b=W9ZhQmX7JbKNT62SfL7y4H3LqGe0q/yttg76zGe4eJYbnLN2FvXqewYSORO9RpPb3VZo8dMhiiiszc6EpOdv4PjuEmBrOWVA6iMhxEcdvHV12qULg5kik3qigbK84DAhCVeDvAw+6WmzEnt5KjsmtHTliYzY6yhtNJQm4PKBM9A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086240; c=relaxed/simple; bh=Z2pwwVZvIgwwTJU2wludLOiTgLmYGa7xboLGjgPwTKQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=uAl62VeTDv1PGtX/bnsNhnB51lrWEfJBXChgpPRkA5+M3pJ9TdyZnVeStFqxHkGRKTuym44p756PCvhz4FrNmyGfXTrSaSgylU8qRDOX3zmGNAxEDSWvhles7yrFehy8SuFHHP3QbPJxtM94Km6eEHIzrtHBU+dNRQlDjVS2QAw= 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=IjcoDWh8; arc=none smtp.client-ip=209.85.216.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="IjcoDWh8" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-311e7337f26so2069392a91.3 for ; Fri, 27 Jun 2025 21:50:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086238; x=1751691038; 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=dPZp1DF+AnYAgGb07vB2UMFLl9YEjHisGw1InIxv9DY=; b=IjcoDWh8xb956pEP+XZ+rqII3PvNYYXjEFdM4EsEiawxNfJHjCFJHV4kSsJZ2ZcD0Z UpS7uu2mESjXoJQCfXIZj0OlfuxE6H0VfvqJQPMmPXmwoQbtx9nu+yK46wOa0iqS3eDJ 2BrlUw2/dOYleHJqFUfy1KYoerMck7MZXxIssT57aTo9KBZsaAg/9b8OVEduSHmjrE/b znvRxl64LoEn1m4ieTKnkRUmG6ZrICUMzaX/WrLklPQjoeKEF6QMoD3urOipr02mQANj s7aHzTl2vT/bogAeDBCnvj+5Szre//SurfNImlXVdkVD8RcSE1VML4RPomI/zmkP+P8C bVQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086238; x=1751691038; 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=dPZp1DF+AnYAgGb07vB2UMFLl9YEjHisGw1InIxv9DY=; b=ags99Dcuc5Z18x0J7V4o3XkG98I+3dpG15M4anX5tg91IHXdZS2kQLlrW7OSS9h60+ utpcz7gziMtJG06rS1XCuL9sAyrUSZPYdhLI89IGDNjYBnQteNp+xUEj8GHjSHtU+NJc FqmqBkQIuIjbx+C9+namdtLUH2RxnM65/hVue3o1vJ6oRSAJlAiKv2IA7i8/mTlpbn5x a7YCJRgld+ynqL+JUzHZ7tMr2PkZhvHB35MZwRTLxdBw0Rr59lv8PKTcJ8+QBDsA4rEf 38OlnjFLAN7YQSOAz1DaNAMkzF96vdgzblV0VzIDN0tHSB1GRK81XA/4emAsLpY8aZoQ v0kQ== X-Forwarded-Encrypted: i=1; AJvYcCWVLMFbWyTHUzly8FE4f2vbOpJXisFuUVQUD1IKs2jNPg9b9i+GL/+tRxrz/5pgE8ry+lDiY40uaHQDLJ8=@vger.kernel.org X-Gm-Message-State: AOJu0YwIZ7HEfL9/Bg+c27KvhVWiubTLaHOhJBbDkZovzABs3H6Is50+ pcakkhxgaG4HdE5R389nB+fsmMzwxDdRNMDGa2yFNEZy3Lv3WJUQpzGuWnX1C76ZrMW7yIsU3mN XDY5Abat8CQ== X-Google-Smtp-Source: AGHT+IFCL3Q9YU7AqufiZFitiUBCS0v3CdXfZMxaNF5NPjGhZrEflyH0sGNIYK2vcuRl7dqRnSVa5OjDliI3 X-Received: from pjbpv13.prod.google.com ([2002:a17:90b:3c8d:b0:312:1af5:98c9]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2c83:b0:312:1508:fb4d with SMTP id 98e67ed59e1d1-318c931997emr10195380a91.33.1751086238488; Fri, 27 Jun 2025 21:50:38 -0700 (PDT) Date: Fri, 27 Jun 2025 21:49:57 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-4-irogers@google.com> Subject: [PATCH v5 03/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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-file.c | 4 +-- .../scripting-engines/trace-event-python.c | 7 ++-- tools/perf/util/symbol.c | 2 +- 13 files changed, 38 insertions(+), 46 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 8f0eb56c6fc6..96e6a5d6eacc 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 057fcf4225ac..97664610c37e 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); @@ -1704,7 +1704,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 2dea35237e81..44941b3adddd 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -2291,7 +2291,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-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/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 8b30c6f16a9e..ea86a6253f04 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -2151,7 +2151,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 Wed Oct 8 12:49:03 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 E2C942206BC for ; Sat, 28 Jun 2025 04:50:42 +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=1751086244; cv=none; b=kGm/6R4EhpSCsnTE+6viJ3DLz83T7vFfgy/p+ZNkF10Cyzo/raFkXJDKcmLQZCEDjfgzf4gjaWf29aVCJMW5PO7lUFXJs/Hg7INZTGJwvIAJTobg8iY+BXxRPo0gc93B+P6OXeeQ1VLpyu/dPMST+rMv262+VRF3x5JM6dqRMWk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086244; c=relaxed/simple; bh=i87jvX210l24c7RqxS+bUYqmgL8+oZvqMbe8qDfav9Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=dVkjRl4dlIIEd8HlT3w7ViR8q/1cXW/dgSkHShLB5pOzq4SzKUmuOp/Up6COlN2WHPgb0bDs7ybX7Vsz6DVujf/omzarIZLFl8QvJbVPE3u6V36yLAYIeml3HBuAWhi0t5Qg3V4k37XISuuNFvT2LBS1y/qefyIi1qEmqhwd5Ok= 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=aJ+jm1rN; 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="aJ+jm1rN" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-7492e654cdeso1209379b3a.3 for ; Fri, 27 Jun 2025 21:50:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086242; x=1751691042; 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=aJ+jm1rNOBubjVU9ObHed7zV966+EE3F08U9Iq11pfrqyPe/kZtiLrt9kIE1RVEreD kgWGX8AEe0HqLDZ038FEkXCzIkdnHjc8kM0Xd6NroJv7eTwuU29u7mgp+Gzg0+9pr3du c4+pH+hxuuVrnGW+ZMAkRAIwA6CMDqnVFrEvB5j//hc35DKUtRgorTnJTPEtmpQbPEvD hoMmVE1oRPRlzTGwLKA5C+8EAb2y/M4GI7+GkrJoWyeKd1PMKSNotvInJv++jBY/DwpX LMkfJzxOn5GBhW96Rq71vpnvoac9GdxXVP3M8xpLiZ6gXgTLW4Cyk2WkUEkn8ANYPZK5 mSdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086242; x=1751691042; 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=u0aHnY1jqMjj/1vW31qgmhfyoYZrgPgFlzpvMazLDkmYC83URFsN2bKw6pWyuDlT93 9YrFShhXsz183fnu1yuk2KhkU3UNIqljwART7WAeA8T0wp38kqm1ZjbrcNhhCCjiK8uJ TxXWT5Xne6Ruj/ozlfEKpkruftazTQ/xU5+H6wBkYkDPvstYvy6SD+QlPEWBClqmyoFF Vx7LIEZw0c9xDK14EpRVJLUa7cm8FK1n3IKsitK7N0dS1b3ZKsOjQb8boHqVtG1ObnQX kJYXHraQN67sja0axx9zSUmm8GvoX0LNxZJKcriPBT6r8IGdWeWraO+Vy7LQJHok5wtz Z0tQ== X-Forwarded-Encrypted: i=1; AJvYcCUOC9IBk7hJHSsvmrOE18hsfP9RH6S4dVN8gDU6wODgvK4/ONAJEmVxhqxaEb0B6e50LHpGfCJ/WoeijxM=@vger.kernel.org X-Gm-Message-State: AOJu0Yw2w/JIThKO/c9X5OuEG493oWcHzqA91k+oV4p5zo4xLTyGTEOg jW3CUorfvTkAmTL1rGrj/RDMxyzAtGkzds7wbwUbbefABsL6hUtC5vxSbQfZZco4m76jA10c1fG YQW6sN6b6bg== X-Google-Smtp-Source: AGHT+IG99HEcqbVp6hJeqxokNAhzYk5D92KArJfEufqUq/84mgt0/AFPB7xsfDOz0Rde1yeTQ+0ZMo1csF9L X-Received: from pfbfb10.prod.google.com ([2002:a05:6a00:2d8a:b0:747:af58:72ca]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3d55:b0:740:9d7c:aeb9 with SMTP id d2e1a72fcca58-74af6fd703bmr7302327b3a.21.1751086240144; Fri, 27 Jun 2025 21:50:40 -0700 (PDT) Date: Fri, 27 Jun 2025 21:49:58 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-5-irogers@google.com> Subject: [PATCH v5 04/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 Wed Oct 8 12:49:03 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 EB5BA22127B for ; Sat, 28 Jun 2025 04:50:46 +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=1751086248; cv=none; b=ZrE9+gWdr5emW/utvwC2cXqsybKOW92xJW3Mxp/mYWMlVPAEWQI2vEMuEhOqQtF5/rJPtDZuejQZoWmclBfW00zNQdFJf9R2/QeRdoQhlYh5gE3vQmnu8n5jrSbcTPk3seFvrEsfXJuaI2XI1vF7EFYc/Yv3m874De1iBHjwVT4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086248; c=relaxed/simple; bh=Rls+OYEH+weNr8mgfAzavaCxy7juMyRMm0AYcaMJ00I=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=JGX82ySWO98YIIQXPuy59mgOrU092wNKXMMslO8KQk8qMR1hE9cWM6WAEwPZVKfY2maOIzQyF3bT+11KX+hidwE9pG6i66ktMK6xBHBRTsjiHCNi+m/lG9bM2Srf8DudlqpRqsOU4M0+8kpc/AasRcshonoBQQ+7w2q+hOwKx54= 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=Rzk4zldW; 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="Rzk4zldW" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b2c37558eccso2349218a12.1 for ; Fri, 27 Jun 2025 21:50:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086246; x=1751691046; 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=BhNgR0jggEgPcm92nWMts4STCtLu+unFNFe51p41/ks=; b=Rzk4zldWyqN5YdiMfxcRsExKkUz15E86mj5+RTmdMq6FMhLQ3k1gUWxnJ3/h9PAQUW aZuU8idY8RPkt+xneCCtXvN7kfMu8fMnGHfYCb7cmMoUSaIcZehz6C3H6RXn2O1TXs9U FnGN/eDt/QnGp4+zBtrE4Z/g7pQyWDufx9uRvqlDp2Mrd6x16Br44Wf6xaWSqPm4IMD0 skMjORLMiNMjUCxHSJTiWwirimGQYnlIZdQz8B7QEjivDPxzoex/K+lVmmXV7b8j8k4m kVbj3/GJXDoqLy2qWfs9JvXXURyRzm/qxNihp9gEJ9iYIoTJzS/CquVafT/pYStrPQqR qbXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086246; x=1751691046; 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=BhNgR0jggEgPcm92nWMts4STCtLu+unFNFe51p41/ks=; b=CBGT8CYnk8ffDjNzMauz3zf7X6pR3/5Tc6TpRVlbK/4msEXu2uKAMurp1LD62JdU6x A8rrUPLH+qI1Gp9KgNYFVttcVv0+C4sVm29A3pjbBfmioVc2xhlr40ZeJcq1KyT8CLv4 +zE2wOJ9MMYA0F0TAppYOr0ARqQY9omBrdoXjxjkdRUgD44AfNnA+Zsu2hAWe5hzgEML IEPSFza0VqFQ4yG0Rg18t9F4vECrI3BSNiQh++BoONE5qWxd665Ec9gS2JdIA4j9QVQK w5X/olNG3G6+FMT79VRpcIyKk2laiNrPtDMuuGIHXHZrxtrU9tptlcC+ZOhiD3ZrShwG SoqQ== X-Forwarded-Encrypted: i=1; AJvYcCVTHdOh+5ocSSHXHZNiR2AJNuDkerGzvqBElz48KONKqiiJUJpYkdd1CIe3FXNp6YfOY3n6sAJ5eyPtrtQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwtlE/RUe7yxrFsIc7ZeROf+tj29j0Hzbiu52pTBbqBr2fgMN1N ngrNMYdrHyn5YhhqiBuv1HPosj9R422U4NJHHDHEeGIfva4f/hIm2mLU4iE4HKDQ9I5yLcz6s3c zzNO5cCSsIg== X-Google-Smtp-Source: AGHT+IHGSP8ghcsLex9rV/DWu974KETLxAJzRGhz0EHAcVyp++M48UPOe4csSadruYBpQcd/oR/J5NXfKFOV X-Received: from pfve20.prod.google.com ([2002:a05:6a00:1a94:b0:746:2ceb:2ec0]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:7350:b0:220:5fd4:a882 with SMTP id adf61e73a8af0-220a16c8c73mr7991271637.33.1751086244124; Fri, 27 Jun 2025 21:50:44 -0700 (PDT) Date: Fri, 27 Jun 2025 21:49:59 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-6-irogers@google.com> Subject: [PATCH v5 05/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 307ad6242a4e..3c87aa6f7d3b 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__sprintf(&bid, sbuild_id); } diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 3cc7c40f5097..1bbb91758316 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__sprintf(&bid, 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 ea86a6253f04..0fe227d32b98 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1812,7 +1812,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); @@ -1873,6 +1872,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); @@ -2121,7 +2122,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 Wed Oct 8 12:49:03 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 CF069221550 for ; Sat, 28 Jun 2025 04:50: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=1751086253; cv=none; b=GVUf9QG0OfFHw9O3Mny87PBZLo+laSLC9RWM0hHOAw2ToSyRwMEGzXgxSJ3HNB2g8atY+he3pAs18uHHTKw/gms7vnoqhyVRNz9hLlnua3VidvbwANFnVhm306t/DCULsdtxPMalY99q7RyfnVSGftYiIt+1CEgn0WCJnVaw8Ds= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086253; c=relaxed/simple; bh=m5KSkZH0H7AMK7XV2JxMV04nwYohb+gb9dnDzsUFn1U=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=RnaCRB3VIgFYEniTfbiQ946zXT3+W18OBzPJr8rN2S4LZKvfDmmOpN61uIVUb/4rQHSd1MMiqOHCPBue8CQdHL38874K27IV+Urip3IuNexGZkibyjpHWMeMxstzmcmeqELCyhCdbsh2tQ2EqIaSAf37WSyQ+AwblIN/FSS4wDs= 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=FsJxtN7k; 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="FsJxtN7k" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-7491814d6f2so3196675b3a.3 for ; Fri, 27 Jun 2025 21:50:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086250; x=1751691050; 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=N8DzfJeco9LZhUKH9Fg7jN/xKRIw0t0/d2bdMGPN1a4=; b=FsJxtN7kAh2Xh+wvDGIOZwvLTaLh4+/H9GDHK6v3JcYSbB9ZucuS9hftIt9Cns30LQ lsjxcVMYpqoyzIYOvlRvOBnPBerirBB+Yy8N8xmnvylGhrJL30n079uPj5cZ3dvagYLx P2O/Ig0ORVqxwcVBkVrM+yW7A7uvmMFZahSP8gRuGCnrnMmRbq5Yly9C+OyR3Rya46PY 09CvXT17UHAC9ZOHcImLKEq0o6vUWr9pPclhfDNl6Bke9+6stJumPGa2oBbgrmIRjloD 7np27ZjSrAwlYBSH0VSZLpQOWid2BTy51xC4S1IUTrShFBlG+OJxA9sPGLPQlejYgnfX TDyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086250; x=1751691050; 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=N8DzfJeco9LZhUKH9Fg7jN/xKRIw0t0/d2bdMGPN1a4=; b=Pr+QDQVh0V83MRegjje/WpYH5hJyB510xYEiT1//KgjJQ9BSNDSBVmjCGRsDlcZ3eE b/ZPkEebkOdv0XjOVgqcWL6dYPAkRc7RIL5U8/9FHMbEyQlW6HIoL9y8VJXtcmNa2Eap n0wl8nABFpINho/VhZImenh7oBHNgbb1buV/qLlB75C4NYhAZ/mQ1o9bT4lzJepjn/Tn S7kG6C7ExF+N9pC5ZFY1jZzG2TxORuZKUiJZjd4c4jXEyF7ELL3dLLgf88XnrmkkSFAL ndc3icg3DtHUsmsn5J2O5f8fI91F+rSU6rSIcKtIbBLO4KVruih3C7jh6XtNC62LJeL0 ka0A== X-Forwarded-Encrypted: i=1; AJvYcCXMSWIUVmTIOwRF2zxe4PIIlLjEKkt75VFbmhWZ7OjikfVPCfd0jOLy7gbeIsWJ5nKFa+RPxWqneOm8bJY=@vger.kernel.org X-Gm-Message-State: AOJu0YyV/CJ2a9UALx/ag0IBmFR7RnUpT5CggFpiU7bbs390vb5uU1Fi ptv31VRYFdO2GlHYhpUeRxdrvspwCck2Y+Etd66a2NkDNjH+xJMLm4KjlGeCMhd5tDuBIKoZz8H oCfaf5LRYqg== X-Google-Smtp-Source: AGHT+IES5qAjKEXed+zWLW2gpjn0h6hC3iptE3I9A1LsDKFcaIznXN1yNacfdhHIBVrl3pXP1yPaLSrxKGjc X-Received: from pfjj22.prod.google.com ([2002:a05:6a00:2356:b0:749:30b5:c67e]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:32a5:b0:220:25c4:1881 with SMTP id adf61e73a8af0-220a1a6316cmr9531695637.39.1751086247834; Fri, 27 Jun 2025 21:50:47 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:00 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-7-irogers@google.com> Subject: [PATCH v5 06/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 97664610c37e..6b99311a5eb2 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; @@ -1645,15 +1656,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) { /* @@ -1672,18 +1682,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. @@ -1694,9 +1706,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 Wed Oct 8 12:49:03 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 0D6D622156A for ; Sat, 28 Jun 2025 04:50:51 +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=1751086253; cv=none; b=j0Wi1JEMugTMIwJgqvl4Wt+9510ZDTqbDls0SdGfhEwwXDHQO0hxehVurvsU0PErGIAseu5FPxw64/UHeD5ixJQnn+6Vvua68+yDRmvwQFcVz5E4AWzZixzrjC7SmrFmvzrR+d3tJ6AAjJsvsSNFeK82PmWFJiMniCAm4Ir8eD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086253; c=relaxed/simple; bh=P8WhQ3O+yjKiV4VpOj5b0RW/o37hKGc8Nx443C7ljNA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Qc5Uh7pWRvNnebyuc3MsW02FpsJu2lR9y9bisOKuxWgzObD8oTIgsoGUKrRwLEvoFtZbz2jz3xrshars6ETYVOMUmVjYXC77nfaJy6rRZr0RqFfyshyboFzOonVD9lSYgr8l5lemwyDLmKgVPGmGS0qYOltZKe7NZS0s4RF3SV0= 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=O24FEBR9; 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="O24FEBR9" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-315b60c19d4so133624a91.0 for ; Fri, 27 Jun 2025 21:50:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086251; x=1751691051; 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=O24FEBR9IfKOTRwtDG+oPXTB3oH3hI6kc9n71NIbNqmtYCK51Gva155Mi7+zTLw8GR Je/G7ASKf1f4C4gUfrIioG/dk8zWnS8j7RGW9sghZ61wmL/EX6DHn6bL+tGqwDkLuwWC FNgtrw86mpdo1cuhFk9a4nsTA8tXj5mfJOaS2hEXHDJKvYDDThyi8A78mfeTeuegaFUP 56q0S9FaUupariTCnSbVaKHjhk4Fjrz4AqIvbRsE6TRKPnurRLPleIA5Lm2o+2lvUzrd QTHrtBilYODCpeV8cX/n3dFL4A3wOpcURImHcrFBY8VfBhko/q314tY+otXMimAwcO2Q r0EA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086251; x=1751691051; 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=DF428iaB8ImFVhBLp55x1OUasqQOh7uCjHK0JIkLZHK9KWBnDDDBWVb+p3t4BuT7Go LiSpfc3zcxXAa+joNmrocDz2/e4Qw9aiM/HJH0/YASBrXK0ZDFt+S4XZFQg2AazfuwoU mc4FXtEzlM+syZFj80inwi1XwG18vkv3CxI0bwl4F10ZfTmINkX6oSSOynNgLUhNK7lA W5S/FpZYIiamxFfF19KtgTM4jiLjESNN6+PpzhAi70O/dnjYsat9xnveJy0kdBIjKGot XmJlNo/zPVYUbMxhHA9Nd0dDMVxiN+9lQN3eZAjOJ68auhSwqfoedSVnzrpDFTyUBkDj pxzA== X-Forwarded-Encrypted: i=1; AJvYcCXUTz4uGjvcLXdLYau4Q1t50FgBkIex0LOYX8kQvr6pwYQwQly1DPkqhGD6cdn4D1uGTcMkM+4eTjBg7c0=@vger.kernel.org X-Gm-Message-State: AOJu0YzaHqJzKcUpXIkxY+1CmiI8GpszeUhArUQMwVFOiNZMX8YjcGTm Y/XFQjjRxsXGSCizJsxx5KUxm93yc8cPLQ6Jrk17g/j9b2+eyW5WGCJJC+WO2/gILUbxCdkoRQb hxK2Kx265vQ== X-Google-Smtp-Source: AGHT+IF8zox2OkhthAIP2iZtdIzHFXeosJX6E/sU7ow+75Qk3dRz3wexU1bn/w/96/gVPeTamXuSz7DToJiH X-Received: from pjbpa10.prod.google.com ([2002:a17:90b:264a:b0:313:1c10:3595]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1f89:b0:312:1cd7:b337 with SMTP id 98e67ed59e1d1-318c911e00dmr7718545a91.5.1751086251431; Fri, 27 Jun 2025 21:50:51 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:01 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-8-irogers@google.com> Subject: [PATCH v5 07/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 Wed Oct 8 12:49:03 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 ECF3321D5B6 for ; Sat, 28 Jun 2025 04:50:53 +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=1751086255; cv=none; b=T6zo6TegheOBiHiwFgL5mq+F6Er6y73p/QPs5rmipmlb3s69cY+tsqeJ0MAnldkf0sLIp7Qq9zm8qX8vpFltrNiHt07SgCWw7iPZjxBbg0bCoOTtn/4w/Duvr6KMDnJCwOfFvEfQ2DjGjbMF5ekXIAC+mx1fs1HDwzMjL6N0eNs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086255; c=relaxed/simple; bh=3xYW2jVZ+V8yHcWI8MeTpN5JPAPdwj03e7PnhKFk/iI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Tke9u89esRcFMX1tTPzOUprOCahMdGVMXZPiTI5uPdENIcgD2fy9EQRyO9SQUqMSi4v9hcNqzzPN2m6UvH1be2arYi+mEvuuEJJpKAausLKiUAVNqSCP4NxyLg12qHZnmrWRhuXY5Bc2mPDtqJUzIZoZPYhXXeW2MBD7GDWCA7Y= 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=Nk/V7grN; 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="Nk/V7grN" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-74858256d38so503427b3a.2 for ; Fri, 27 Jun 2025 21:50:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086253; x=1751691053; 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=IsuMXS2KVsY9wSt/6mCAAI1RtzhnXJ4szVhJS9DTq2Y=; b=Nk/V7grN8aZGCpeZrSwPG036mI2hrNTVDkGL54XHNDTdXU+DDWr/VCgJoKFP1WjZVD iDAX2IUT/IEaF/mvAQ1IWN1A8kr/PG2YxnNKVmfs0syYnk06k6rYcYA7kxZrfi79ei9G kazeTzgyvGr07NDQZWYYgOcY1YvAN6p9I/lsjqilCpoNtWGw1CoK2MgmCFEmxTBvsh1i ayj8KvBra5hFpccnJpD4rN4D+lNwaD7Mzd9OHWqPLtAByS0QEAQY7sPYlVFdx7q4OQ5n doZX9M2v5h01W5RnGjAAQwGSH5+lWWaSZZHoVFPzJDkEZInvRcXHrgdvho9hL5Tiahjx 5hVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086253; x=1751691053; 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=IsuMXS2KVsY9wSt/6mCAAI1RtzhnXJ4szVhJS9DTq2Y=; b=FcEF67HqX3+5ZFTUMlflURu9Osrpe6UtXis3a5y2+hbxMsrHnHS1vhbiE38Rnb2+02 eis775jPU8mgUVeaWNa5bQUK/a/56eJTgIMUT5ess7YdORSUwVPnPHkLr87yb6Zwej7h 0aaOsWqpnGem2xtV/o53ABG1ItCJtQr5W0hjzOh4pFnf6UH3/TaWFgpnDFMh5P8ogPsf hxh9pz/KF54BqI9EfmSqw3pQRtZE4IrbBkx5oiT4/fNUXON/Iux+fdPE6zmmKFL/Ztfu BgOJdCx86IHLh4q5CyxWgC4nD0HKe00PHm1tUCpUhENWu9pSarC3RB4St9Bc5/ZH8M23 Wxzg== X-Forwarded-Encrypted: i=1; AJvYcCUUTxLQzDQoTEKppF0tHGjvGnDMpZBYm2+TVucFqn1V+01RnYUgFu+8XbQzo1RpRCbOadWXwAr4oOaMw1A=@vger.kernel.org X-Gm-Message-State: AOJu0YwzTKfKKh9GLLIxVaPDAQA1SmP/1datU8dCm4+R0sQ+e4vyjZuE prZmjGk1UrfctuakNqvWQp4uOAKRfmd98cSslq1FInH1Oe0f8Oa88KM7NqdJwwcy1GVGo5KhNxd Msb/5fc+2AQ== X-Google-Smtp-Source: AGHT+IHsgP0BSA3zpM3gKeGrjNbPHAhLR9qMlepW527uVE/3e0PokK9cl03zA8A9Mhj3Exf4RPg5QEJ/1g7t X-Received: from pfbmb13.prod.google.com ([2002:a05:6a00:760d:b0:746:1a2e:b29b]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3392:b0:749:ca1:1d02 with SMTP id d2e1a72fcca58-74af6eaa39emr7048192b3a.6.1751086253139; Fri, 27 Jun 2025 21:50:53 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:02 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-9-irogers@google.com> Subject: [PATCH v5 08/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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. To disable build ID scanning Unlike the --buildid-mmap option, this 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/builtin-record.c | 33 +++++++++++++++++++----------- tools/perf/util/symbol_conf.h | 2 +- tools/perf/util/synthetic-events.c | 16 +++++++-------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 53971b9de3ba..29428fb8ac67 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, + "Legacy record build-id in map events option which is now the default. = Behaves indentically to --no-buildid. Disable with --no-buildid-mmap"), OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename, "append timestamp to output filename"), OPT_BOOLEAN(0, "timestamp-boundary", &record.timestamp_boundary, @@ -4108,19 +4113,23 @@ 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. 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 Wed Oct 8 12:49:03 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 160A42222AB for ; Sat, 28 Jun 2025 04:50:57 +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=1751086260; cv=none; b=gpQyHijVMmatVck4lFJDrKzUdjNvDZp4PS9kY5iHt/SErCMnRbw9XjcAaCEgQN7q07hfIiCoWyX8CK30+5AasI/pT5UK8UUmz9IA39aLU4twdv9jx87ovmGMnXlVO6NjPpjioYo/zPgeEYcWAKcaOWngPBGyRup349k8v1NMJf8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086260; c=relaxed/simple; bh=IWW20sAxpjJPs8u4g6HeSQpT/Zxccb4SvFd/XqwoSqo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=AupfrOn+X0x/x+6Vsm8VujjSFdMjgVO44AxWKVhKT62GGGbrs7fgjh+hTL8GZH/FIjwnqVdMctgmLAgQJC1AjZTf4j5I+/PPzxLgNSNr0ctHED5lp81gNvv1w3KLs4iotH0Bga0bCVxWhSUGtz7nDEzgMbR/zM62HEv2Re3UJHA= 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=RrOPVD2h; 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="RrOPVD2h" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2358de17665so2006095ad.3 for ; Fri, 27 Jun 2025 21:50:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086257; x=1751691057; 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=cnGSN618hFYD2xVuQNJfNO0EdI6AkMOhAukFHangDiM=; b=RrOPVD2hgYoIMhK8u98zBHryd4nhrT8jwbTZkNeWCfV2hy0IkyQDKAavwGp0+dl/UH YS89+/JLNRsah2Zb9LRgbo7ErDuqmU/IoSfMAPDWlRSZfZwat/Jt5HrFc82HlkSPpND6 HhY+JhK9ZAlOvfFlcFftx263aTbtUYY8BcDL8RtcHDPOZSPNnjRVL+hFv6EziQlroDkn rylyWzd/GPFt3Fkh20cy+rOzCS979Nr8vpzB6FQv6hRzGcQf4ew1nbWKLaXmWpwzcdpK uEqhU2af1ChxRMccD1suldKNDje6Z4BPH9NbpwOsO2S1gzyt8e+rsNMEPMcIVEWu2L4p Frpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086257; x=1751691057; 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=cnGSN618hFYD2xVuQNJfNO0EdI6AkMOhAukFHangDiM=; b=NmaX6P4tSAYKzBd0ZTL9VTAo/2I33NC8rVzNFBg2LFOiwodTjjai28uZPVxH5fI0jX NtXJCdJaW2l+UkW73GXlZsNU5bQ90lL7RdhhJeqRsRG/smPvIFpL7smEoFgb82YH/JeV AyJv2ON7sRkAphXDvHuQ0QreAL/96Q1iR3A1CJtPVzeOS3J3YTAlBMeS6cMJJFTaFWoF lnmhMYgdw5ghRjAyq3d+0/yOBbqd8jSwIQB1CuolvMfVaEyG2H8zOYlbG0En8/NSkR8c OMvWI8/GRxwYNN7ujWtVyQ2k1SRnfRiCy2x2SjEDpokEg8VFYs2qu/587H9mpWb8ertl 1GJQ== X-Forwarded-Encrypted: i=1; AJvYcCUMSEOsDM5U+kXhs7L7sBu97CR66BUAQzX/JWxREulswNVuAQeqyrmlJQcW2dWRfyW+9wTmmUoMjyQmwBw=@vger.kernel.org X-Gm-Message-State: AOJu0YzbRVmk1qlvzkSCoAn6K88Z1TJY/CZbhtvgfnK9gT2skx5NT1Zw ihJ8g5LoXukTs98vLrlxL00LcmrWHVV12x+Fbw7+NdCPIntB0P1h1GtCzQKGg5Sjh1JzYY9PXRz SYwxbHlFHig== X-Google-Smtp-Source: AGHT+IHQiRZpuApyEki6tLJWIksPPK+hubnBz8oYo/xdAr5e2/v1L9WNdHB0VBOOE+9HF9eGcHLjP+dawqfR X-Received: from pldy17.prod.google.com ([2002:a17:902:cad1:b0:220:ca3c:96bc]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2305:b0:234:d10d:9f9f with SMTP id d9443c01a7336-23ac465f724mr103397335ad.40.1751086255378; Fri, 27 Jun 2025 21:50:55 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:03 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-10-irogers@google.com> Subject: [PATCH v5 09/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 29428fb8ac67..546c54b34155 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 26ece6e9bfd1..9b5c2f693bbe 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -1922,7 +1922,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"= )) @@ -3236,6 +3236,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 @@ -3260,6 +3261,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) @@ -3268,7 +3270,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"); @@ -3305,7 +3307,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 4001e621b6cb..8a452353c867 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; @@ -3864,6 +3864,7 @@ int cmd_script(int argc, const char **argv) "perf script [] [script-args]", NULL }; + struct perf_env *env; =20 perf_set_singlethreaded(); =20 @@ -4110,6 +4111,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); @@ -4119,17 +4121,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 50fc53adb7e4..c6683e748441 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 @@ -2113,8 +2113,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 051ded5ba9ba..84b223a94dcf 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 c38225a89fc8..9e2439f9bb00 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -4752,7 +4752,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 Wed Oct 8 12:49:03 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 0268321E0B2 for ; Sat, 28 Jun 2025 04:50:59 +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=1751086261; cv=none; b=pqCU0a2IosiHK5K9SIn10PVn1PGM145Z2DXREbhjIwcFEfaFMHRqosgBJNeyts+SWKxM4Jl1wg/dv16isTg+7YMEybrK9ltWUKA0ItDTmCJnJGMQKmsCHToJ+gFMSY6JcCymtabZ93XEsrwBaRPQzkZRnH2u8GOZXiTf186MUmk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086261; c=relaxed/simple; bh=zld8u2aUntHwWVLcqYGsjfz18gqy3sE21GfAwQ2A4og=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=HPXf5zAOdfSAUll4NJFF8JhGN4XIuJibqAmrfbCncWGXbSlghQW17+I6g9eAmkeOK7kF5sxAc19RZX7j0tQxfwy7J+4DtblaovBrc5KHedTPcc/nyM7GpOUrpiCjAaSQQ9y+AkS5tq4VC97r2d7IDWsCpual0yDmpS6FcO1MZAc= 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=m83AGzSs; 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="m83AGzSs" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-747cebffd4eso462477b3a.2 for ; Fri, 27 Jun 2025 21:50:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086259; x=1751691059; 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=DMI97uZu0xVTActQ5VqzwsLdtjEz1oIqfwYO1zi5T/w=; b=m83AGzSs1bMepSB9wMuQf72V19i58FslbNac2y5R9EG4GaabMhX2G7TfA/4cDZSHpd Br7DxHz2d0m8aEwIgzXxKzm5dLv4Lr4CBlDbIQI6Q/O7b+x7mqNLOvELOvvYLAj3UnbG 80cBn+j6Uxy4cIvCxGdV06+l8m2DxRgEe4Lf3s810XA1oBvdIELRYQhVo2Z1fHoTXM2c PMR4aZkZm1pK/h8haE+LYX6pcDjC3Boy76pMVm1Duvvqhi7HASeSyL4JSuqgNwrkYivM J4ww2dovjhQMw97QcDNhjxTP1uFKF2etozGsPlswKI5b1SeyGol5uhlxew/DD/ESZpU5 b5uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086259; x=1751691059; 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=DMI97uZu0xVTActQ5VqzwsLdtjEz1oIqfwYO1zi5T/w=; b=OJEVbK8PBDdyYzvnf1koT2TiRGgC8EFSuYjB21GHWNf6CzJdAEGdUI5HdDn3mSIpnI twDQzrZw9O7DCaOurtzTB1hyUaXbPkoSrVK0b/RuhkGJfXpPumBXRP4XXNQ21M6D03KT HdNyXgrLVrLmpz8hbVrv+Bp+mqWbsZ9RcsKRAEojnPgYqNQxFK5UhVj2bchCmMh7ZuqB AzFu9cR100vG2Tn4HfMaNC/Y4OvBA1oYb5lFxuuJh0G0nnD3YQp0BEVgbKwNqJbtl4lq c6g4YllqoP/ycgxr2oQCRy7EDGpmwSKuHdfM1BlOEgumPwZhOy9fq/zh5UA6pQS3I5CA s/wQ== X-Forwarded-Encrypted: i=1; AJvYcCVckFn5e54N95sfh12prhDk4SOxeoNen6hFb4/Ah0mnIDZJjbBdt8SbGYM0UUaCHjVgoNO9RqHzf9JKvBY=@vger.kernel.org X-Gm-Message-State: AOJu0YzZ8A+KB6vSHRvcMKDLOCbJRJMqQlribMLhcFeMHuLbRzcpd8w1 8C+HGoVwBcQMfrOXfG1BeXr0d+0DUgcyfOwccqRYtDPlgXh8uEjpM+DJA+/5uQro4cVFqtn/rdk MQyOWDonMBw== X-Google-Smtp-Source: AGHT+IH1BScBx6vJzRt0VeNppu+SsTR4FsyBOv15AwXFrWSby58ouKxE4a/gCiqIyNSNoYfuU0r1Og/qgGQa X-Received: from pfbdo6.prod.google.com ([2002:a05:6a00:4a06:b0:749:1d32:aa78]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:aa7:88c7:0:b0:742:ae7e:7da8 with SMTP id d2e1a72fcca58-74af6ee4838mr8593184b3a.8.1751086259182; Fri, 27 Jun 2025 21:50:59 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:04 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-11-irogers@google.com> Subject: [PATCH v5 10/23] perf session: Add an env pointer for the current 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Initialize to `&header.env`. This will later allow the env value to be changed. Signed-off-by: Ian Rogers --- tools/perf/util/session.c | 3 ++- tools/perf/util/session.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index b09d157f7d04..e39a1df7c044 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -156,6 +156,7 @@ struct perf_session *__perf_session__new(struct perf_da= ta *data, ordered_events__deliver_event, NULL); =20 perf_env__init(&session->header.env); + session->env =3D &session->header.env; if (data) { ret =3D perf_data__open(data); if (ret < 0) @@ -2750,5 +2751,5 @@ int perf_session__dsos_hit_all(struct perf_session *s= ession) =20 struct perf_env *perf_session__env(struct perf_session *session) { - return &session->header.env; + return session->env; } diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index e7f7464b838f..088868f1004a 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -45,6 +45,8 @@ struct perf_session { struct perf_header header; /** @machines: Machines within the session a host and 0 or more guests. */ struct machines machines; + /** @env: The perf_env being worked with, either from a data file or the = host's. */ + struct perf_env *env; /** @evlist: List of evsels/events of the session. */ struct evlist *evlist; /** @auxtrace: callbacks to allow AUX area data decoding. */ --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 12:49:03 2025 Received: from mail-oo1-f73.google.com (mail-oo1-f73.google.com [209.85.161.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 DF778222584 for ; Sat, 28 Jun 2025 04:51:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086263; cv=none; b=o8pCdJoUVSUOuf4oPLqsmA4dwkVVYi/o2QATCAem3oNvC80zSB4wdztH1RtKOedDGftyCKHYd56xFtymuxW+54Gi1Os+sskMEdKLl/9ASfy0uhSlUCVI3O3GgTQbuTDxzaEp9+AkkF6HSGIBTePTLWAJl+Qr3RCx/nU5sa5hNW8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086263; c=relaxed/simple; bh=1LZGMWTHze8TY3G0ikrz2u0m1pSzabfYAWfQ5jh9Q6s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=rq5QaNr7ee0+anzqdbVLE/tRsIFOr4vQfzqCEgohHf06UItG+7CKeiHMBPJhUJ8od92cHONTVxZh/SCReVL0uz2xPneEJlvpEfP1QhZ2EKcBAy+oiIx5oFBjqOGCcBbPqrsrEsJs9ejjJK7w3KEgpAy52UWfWYRDByarF2cIDQA= 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=1tLAgHIp; arc=none smtp.client-ip=209.85.161.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="1tLAgHIp" Received: by mail-oo1-f73.google.com with SMTP id 006d021491bc7-6044db45c83so385769eaf.1 for ; Fri, 27 Jun 2025 21:51:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086261; x=1751691061; 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=vY0eUbYXtmF+t+TY6dxfjdCllkKtrQTihwoCq+bVxxQ=; b=1tLAgHIpBu27DcL2mTPSv4cloPcU3NGlcjf1Cx/VKaI+TL69g4awF60jJYOxQMMK// v74byPHPeHq2GSXA/4z3VDEkDHJOR+5mwvIdrp4qHmcI64cSFvqwZ2iPbfjohsfQCnHU uuOQLXiTmZizMSdAYFoTPfXE5MluVrIBzLxbVTiw3LhbCZ8nRk+j5i9OMEHmb0eIGd7/ Feguweakh7fJE4HW8TmboqOT4gKYLpLdBDqyRafsnS3cKZrApQ615x6pURh200KLxC/D RRxzpurefWzKBC12G/5+82NnNmMpReZ0q5hMIPfHGEHgjtm+s4h4aJMTF120clzMpK9V /uHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086261; x=1751691061; 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=vY0eUbYXtmF+t+TY6dxfjdCllkKtrQTihwoCq+bVxxQ=; b=FNPo1QJPAAvFM5pIuHU2qZ0qdkWs8AZg1CSRB0NXjTIxJv/22bvjWLwzXaX3IfgiGt 2E8WNrW5bNvZdCCXkIJmKMu04cVxvGAKUp4GZRGpocGqtrL+Jgl03YnhuJv298L5Z05F WTW1EwQs3NtjpN1bR1tb1ECpnKTUxSZGrNp6Uf4OsVO9X4GvXTSx3SsxKB+rr3UP6Xyc oHIzUPIElNsjBz+K3YcHpmGRy18A1x5y/uQ3pqqGgS1OnRDxNiUc29w7uGSF0ZWj1/lI DrqsHMgftalx7161s85FycrqsOgn8p8kcbVSeg0nTJK5SpxVQUYsB6Z7J+hipjVrB56R 4Edw== X-Forwarded-Encrypted: i=1; AJvYcCW8yHgbQS1z+dmd0+m/La9lobgplpUGC9SmOHEVYtx4Fc6xJbPrft/I2kwl8dyE+kMfDtru6+itgeGQdVc=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8NjB58QfrHyYYc1aZl71DKvfdTUft8f7n1ML281J4zc8FWcLg G2NrO86zAKWKSVB/UMmu4LgyxrTnAe6fU5rrD/beopSkQCviL2t5ARNPPIrTC+mNpfGYHVBteoF p2HaOiFTxkg== X-Google-Smtp-Source: AGHT+IE+a4QtJs5jJ0mKFHpLVUIqiUu2BIry1+qnZU9jpTyic0dsLZYYkxF7DtYL5f/plkjvSxLO6AcPs5y/ X-Received: from oabvz18.prod.google.com ([2002:a05:6871:a412:b0:2eb:dbe3:399c]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6871:2113:b0:2bc:716c:4622 with SMTP id 586e51a60fabf-2efed7c1ffdmr3661467fac.38.1751086261010; Fri, 27 Jun 2025 21:51:01 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:05 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-12-irogers@google.com> Subject: [PATCH v5 11/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 8a452353c867..2c25eda4be26 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2535,7 +2535,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 84b223a94dcf..72f9be5a3b30 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) @@ -1822,6 +1821,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 85859708393e..121879aef60f 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -70,7 +70,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 d55482f094bf..24c93ea5ba0a 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" @@ -3839,11 +3840,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 6dbc9690e0c9..847acf9f6795 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -537,6 +537,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 44941b3adddd..c10eec0e9251 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -4213,7 +4213,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 e39a1df7c044..29f5d376f65e 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -178,7 +178,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) { @@ -194,6 +194,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 Wed Oct 8 12:49:03 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 2046F1DE88C for ; Sat, 28 Jun 2025 04:51:04 +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=1751086267; cv=none; b=okx/1j9jhZlbwBiOayHWfX8PyblgF5lfhF+FAXj3hXNZIi/3gDryfNW1rEFXqiGza83Cy/b9xUdfe55bUrfiCaO8GlzXrk9tJ5TgdG4jwvLUVJJxTFYhbR9xsXqPLyqFOxuKayColRrp0EWOcVEytenAJMlJXsmjfm9g2SUF4iY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086267; c=relaxed/simple; bh=GvDN0H1vXJLLfp/luAUqMPEmWpcV0CCG6tPf5Yf7GyY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=tu1QLhq/TX+68qAtmOkXHH7Krizw+Vkxvh2fHpxJYL07pHJGRbkEiIm1ChoZo53t+fjZjWuXuhXhuYZGBaEgIUZCe6K1WPKjzL/sMlUiyFhliu3nDO+Ejy/LiYgUFmr0SH+CS0NbEQoJG94JT63KbLlzZu9aYTvbzqC8CA2FvFo= 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=iQeKVYjx; 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="iQeKVYjx" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-7489d1f5e9fso4231035b3a.0 for ; Fri, 27 Jun 2025 21:51:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086264; x=1751691064; 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=zsEDp6xwNwIwzZEWhKPsM08GRK6vRWpjbR0qUpsi+Ck=; b=iQeKVYjxryXwQ0SD6savjPuovV2DmmDwIBwolmr3N714eWw2fp+9qixmziEecx1qrA S++gOi8jy8myMn4WVk77pnihK0/lMi0yxo66t58Grx5ik4ktJ3FK/SRKYUcR6Mf3wASK MWf7M/lQ2Dd5DGp4FaVIw6kfNfjG3Mvb3IBYh9b2FM9Wkn2eDMLYrMpAdDOpNmyVx5tJ A47vdIoTOhw8KbqR7hJbO2DWe7mSXHiMt3e/kCcr1ZfAIBL1WfKDRDCrGA6CcOcHZkHM 0yx8qHtUM+2wkv1CEKCJK0gaA1FMKVRuTEOGuEqz5cuJlQ7+CVcctwi6kywCKWi3lBG1 a4/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086264; x=1751691064; 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=zsEDp6xwNwIwzZEWhKPsM08GRK6vRWpjbR0qUpsi+Ck=; b=iJh8Pnx/UY6FIt06mP0pX1X+l0jniMTWJuEZSveL9Q3rcu0JwyQiesw4nAFC+W4X2H jZlympD03lbkoM1z50kdytiZTBYihftOY8nM4Srknh4oU1ZyMPC1x4pLsibQUbcH3fXK TE6X2KxccVxm6EB67dH2vNfcm5Ml12SjTtZ96x+i85am+nRCgKuuHC6o2tRPCCvVLNP1 mJPpAOGUlqKBTCRstAaB0+2ofcRbfhDTBImGd3DOOkRcYdUXN6Xw8Zx9E6/2wLh1Yz0Z 9diXXFlXCdlPExBDGDJ34NgX+HRtTk8Gu+qkcOdzQlkn/y1JX5kBjCEsNbPkjoSoQErQ Q23w== X-Forwarded-Encrypted: i=1; AJvYcCV5uJWj9rIAZBN5IZLaBO1fCB2huCvBFxgfGbmJKszB0KRzgC6XKnywWWLQHfcUTVZiLokPWWtH2Qpat3s=@vger.kernel.org X-Gm-Message-State: AOJu0Yy84quWWtcDCG4p1KOVwVmDSXIulllCsY6xoZzkImQbcGslXBPr 9lio1BGQ886DFrTcYbpXi+l2YMrzHqyOwf6+7Lvo+ayNcCC3tMltGp6ZCVRaPrLYMmI9z4hlUUz 9i2gzJyIdww== X-Google-Smtp-Source: AGHT+IEXyY9vULeqvHv+qJpPOkHEV4+G/r9H1XFrA9h9YU3BuKOmg2qewTx4Y65HqoaWaONUHUCGDVOkCDN3 X-Received: from pfih22.prod.google.com ([2002:a05:6a00:2196:b0:742:a99a:ec52]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:a111:b0:1f5:6f95:2544 with SMTP id adf61e73a8af0-220a1834a51mr8276051637.33.1751086262917; Fri, 27 Jun 2025 21:51:02 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:06 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-13-irogers@google.com> Subject: [PATCH v5 12/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 c10eec0e9251..19b485e5fc52 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; } @@ -2111,17 +2113,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"); @@ -2130,18 +2133,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); @@ -2223,17 +2227,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 @@ -2431,6 +2436,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 @@ -2441,20 +2447,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 @@ -2515,13 +2522,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) @@ -2541,8 +2549,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: @@ -2556,18 +2564,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; @@ -2583,12 +2591,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++) { @@ -2602,14 +2610,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 @@ -2617,13 +2625,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 @@ -2637,7 +2645,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++) { @@ -2651,13 +2659,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; @@ -2666,12 +2674,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; @@ -2706,8 +2715,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: @@ -2717,6 +2726,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; @@ -2730,7 +2740,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 @@ -2749,14 +2759,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: @@ -2766,6 +2776,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; @@ -2779,7 +2790,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; @@ -2863,6 +2874,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 @@ -2903,8 +2915,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++) { @@ -2940,6 +2952,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; @@ -2978,9 +2991,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: @@ -2992,7 +3005,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; @@ -3001,6 +3016,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 @@ -3015,26 +3031,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 @@ -3058,8 +3075,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: @@ -3212,19 +3229,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; @@ -3296,19 +3315,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; @@ -3346,8 +3367,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: @@ -3645,6 +3666,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 Wed Oct 8 12:49:03 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 E64EE21FF42 for ; Sat, 28 Jun 2025 04:51:06 +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=1751086268; cv=none; b=MkA+DkMkXA3bbO7Rvi4C9nPh1Y9akuASf/wyzSAUsesdzBwzQAd2xRlhq3fRN99ik1nBZjPvBnUXfC25Lb3xU+yifwkfSBiXAOvqiIEXkhp9YXXy+K8ZI5mZWG0CfRsh489C/KastNom1HtiyhOAlM5CIUtxdLtvuQkh+0KVuHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086268; c=relaxed/simple; bh=Wqv10aBltPBXUHLr9USn9Z7UE0yIqyWqu3PrwUYHbiI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Kn6DFLdBWpRH/NR+kXSIr37Ciz2wlHez/r0jDdvI4KeHoJpUCPChkRnpJVY7p7LcbiuKNadph0cyfZ63YSiL1+ta9TW7yrH9xj1ugRyQLXW2x6lMaewFMPn851HmfbcaW/iWsYAFlPX8BZiVhyXHDZmm5Zh1pmspAYx8M70K9BA= 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=cFUaKxYT; 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="cFUaKxYT" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2356ce55d33so34958615ad.0 for ; Fri, 27 Jun 2025 21:51:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086266; x=1751691066; 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=TT9zT2536gJjOZ4EIQ6l60zD2zdNSDXQaYMi8NYa5Ek=; b=cFUaKxYTHEx3hZHRPpKyPcw8MTjoVpaX/9uri5VU8ktfSe1BEVpsqJ3VE39pTsaIGI 3gjP8Po8pxXgWqXObXR+y85IEoMWcdJp0gPozq5y9XwsnTsr6ZA999o5+oY5oEgkFaXu gXOa3MUcnad0u8udH2Dkk+VxjSlXOqxnlbNC2ElHYWx1Pb3OLJEIbepTYnPUxWgEZnEN 48fqRr63uJ3RTb4xglZ2z4RqmQOsk29UvsLZdvkW1vHG6rDHsL9f4QLbMv8vNsX7M6jf VSxz8Iv5QkUEyyxQ+CutTqGhe0VvYfRT53M4btsKrL/phkO/rJnlx3RD1f2gupVPK4fD wBuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086266; x=1751691066; 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=TT9zT2536gJjOZ4EIQ6l60zD2zdNSDXQaYMi8NYa5Ek=; b=txoodLD+9zI9A6LlU7jXyYBtdulk1tUusprIVrNOZnHI3FZZtu7phgLSW+LO+ZSQXs 44HL6dOV8OTo0OxdoXMV1qwxHfEaTQ73C6PCuhS8NyrMedGuVBHHgf5hin2XApE0t5SN urM5AwRflbMLzj8dfGf1m7WF+t3YP+YvqTni5sbF9AgJUAqG2ur8nNeRhmjI0T/nfIeH MJkmuox1EaX1d3HGGWMv5nShjpuvYVYcfLEW5KofCHPBnwk7rOxcgB/WAedaz8IYA5sc Ij/TsKraIBOEhk1IGo1VrEGNRKiPTmcvMCwzhvFf1g6Wlw4i+/nyaOj1jPwdKAwECBQk S9TA== X-Forwarded-Encrypted: i=1; AJvYcCX3CdeiedVJyuNsJ6RM/hbQRNtwHZIbPFphk5sLLhmrsd8PEqCLlw6JM0UcxoN5HWPS9fPzoCLZ/FZTv5M=@vger.kernel.org X-Gm-Message-State: AOJu0YyIAzPeCJW+Khy5SNUP8cK5P4XPGkuhK3LbFH1iCCuYx+nEik44 Z3yQi0HRVIyZ5DKdrH8YM6I5O7ZA1v5jzFej86+0Gmn0asCYGPA542TLkKUx6NQeMAq+IUx/qJt HDfXLZ5H2ug== X-Google-Smtp-Source: AGHT+IH+KbSHYBqzmLEU1hrbmakGCU2JwYO5D/JSKx+kk6D+KFS8VGHUVFIV2JLOJ7PQwIr4Gzdzdb8sHtJc X-Received: from pjbeu16.prod.google.com ([2002:a17:90a:f950:b0:311:6040:2c7a]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1a8c:b0:237:f76f:ce34 with SMTP id d9443c01a7336-23ac40e02a2mr85189075ad.15.1751086266211; Fri, 27 Jun 2025 21:51:06 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:07 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-14-irogers@google.com> Subject: [PATCH v5 13/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 cf6edbe697b2..4b2461e93b2b 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) { @@ -798,6 +800,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 05a4f2657d72..887a6fb7104e 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 Wed Oct 8 12:49:03 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 E4B9C21FF4D for ; Sat, 28 Jun 2025 04:51:08 +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=1751086270; cv=none; b=UmWBcFw/klJVzvmRndHmhpNYk5Gi8f9PNiqgawloQJGgcAEMgfRGeUMPH9zD5KvrbG0t+Z/ljplSR4Fa0WyUefrCvk3g3XlP+YGGWaPvQ+jewOdi0MYg4+kdT/nD6F0BcG2A+lp4JbNzI/WGDcbAueqfc3SqHOAuW76N/TPxrcQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086270; c=relaxed/simple; bh=DPI9xBrbANtC0AjWx1TXDH9XJ95Ix1xdjFOPHMGqxcc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=XVprW56+NlzF1krScEDEMn+qiTBBjEDk/oCp/IudzSATXQOSyrdm9bQAL6f6dPydFqMjpOlkBwW/KGrqwplpp/Rq0xCvJOXn+sj00FqM8yRotsh+RZCqCqWOQyxyPxMuS/Sfpg0qe3gA7aAzkeSfMEAUqY/yOU/TZ9NiMw5y0LE= 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=I7ohn9uG; 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="I7ohn9uG" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b2eea1c2e97so2263051a12.2 for ; Fri, 27 Jun 2025 21:51:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086268; x=1751691068; 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=fZlstsLgRGAIldryTkxHrfcOL2Lcf7CF0yH0swczRGA=; b=I7ohn9uGUZdLnC9Hsuup1KzPsIqgABRzPCWyjTi7hps+BFH4/oymrtDWE9dIVnzFcZ Ud1EYY5wCgvbjacPdawz+uvxMQz0uAZIWf4iJu9LZfE/JrvOlwgp6Rwh1ThSp513wIYb 7o00v5e73bfr3uDFzcarLYDm4CGMwyscbGjYLZALvFBfsrapSKvkW73/fWDLYB67h858 PGjuQ5bEY1MqF8OkJj/PDy32Aw7H2vV2v2Od1r3G8ueB2Hhr+h3RyWFUgqjFAQPR0+3L stljwkVQLEO47QRvgJaRotdlYsEvRCzm1uylkVUjz5Bk+2v/GBk3BIkjrS9D3GyB5u14 wNzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086268; x=1751691068; 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=fZlstsLgRGAIldryTkxHrfcOL2Lcf7CF0yH0swczRGA=; b=UxS1z4ZaYKTEImI3KqbNrAmSzIK9kpcF3SxIZRGjgiZor+Y+yzMRMPosrykXMUwg7R iZaQ3GML0CZWXZmmPsivtLi0RayNykHG8yjuC/cCLFaJf/D1852T8ke5Sar3BBUoYcpD nMXRytqPZwtHtS/wuaXbPm3daxGWkvd8QiqcUcAcbo4m7dR1zr0DXf7VdDJIDIGt7qkm iUsC0YxdQCdq4A/8ibp8qM6dU/mEnWIlKVdTbEGab0DkYY90jJlZi1cFRNeGmzoTScz+ Srm3MJY6Crg7b3k2N0hRv+cMXJJ/KJWxN4n5k+BcFuXXo+oG/mnIVLqner3J+l9/HL03 aWUQ== X-Forwarded-Encrypted: i=1; AJvYcCX84owtgQK0VCCDA9GhGaAx9AdZr6xfbkgM/mozDK8pLBKTUm8Q+HwHGElG7sEKN3CIZ+x+vi/EyygccTE=@vger.kernel.org X-Gm-Message-State: AOJu0YwoqR3HGRAeZDUa/byUKaQP/xpeyLzkFRubUww7KxZkqAX4Xti/ IWkht6EHPzdnzgREnYVOJrW2hY446UukBO1vC/9XtM0MAgRRr1nfo56FywpnGtWpKU1sD7CJJ46 RkGPnk8f8xA== X-Google-Smtp-Source: AGHT+IFNKGPl5tSYmPM5NWTYrrNKaI0ecBZtB0WVfWzlQ7HS7ewyluPy4cBxXUH1WGDmBhKuFKcc+0aSDR0o X-Received: from pfbdw21.prod.google.com ([2002:a05:6a00:3695:b0:748:df06:a477]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:9202:b0:1f5:882e:60f with SMTP id adf61e73a8af0-220a12efb84mr8419125637.17.1751086268072; Fri, 27 Jun 2025 21:51:08 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:08 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-15-irogers@google.com> Subject: [PATCH v5 14/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 29f5d376f65e..39da4ab768a5 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)); @@ -192,7 +193,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 088868f1004a..baa59fab761b 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -109,12 +109,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 Wed Oct 8 12:49:03 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 BA9F7226D1A for ; Sat, 28 Jun 2025 04:51:12 +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=1751086274; cv=none; b=g9b3iOPyZEgI1Wa6paZjyUJ+cP7tqEOatfBctM5z1z6LSHFD5j3z4HOjr2m0sZpOynG/yqg82nkFXiizAVXtp1mSUlv/YjxlMJt46LZJu34ayJbsRS1iOzIDtrXIIP7XCVe3WPU0Nw89vBDM3wfEhekZy/GiP30VdxTCTNf3C38= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086274; c=relaxed/simple; bh=8RWUW+TcnFEXdNv/Uk32ZicFePVvRTy5c3CKcsXSp68=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=SbOORVdDiVW4arq8AoD1Sf76P0VP3Pujn07+UrHEi4cXpzple+xx3SfeqT9TZlJyBwYEZ2D4X4E21nrNm0KW4WTQRXU25didsoX4fBmdlY3LBAgB63+ogGNIZD5h1koGI44hZ32le9KGuJQ+AnFmW2qFCH+VFXe3Hlr1uZAMTRg= 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=g+ATd3wT; 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="g+ATd3wT" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-749177ad09fso261610b3a.2 for ; Fri, 27 Jun 2025 21:51:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086272; x=1751691072; 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=C96JAGkPAc0LFzD2iy/4OszeuhNF3cJzB9GEOz3PGEU=; b=g+ATd3wTm+AhW98ipVEBvO0saYfjNdSpxM1BQJdOv/qatLJ7vb3r2U6DG0UiQf8ZWd SRKYnQ/WsJMTW4kHHpGhdWBKKHbO+4iAkdUIbprtskOSn0mW92FQ1xERcFH7PEwXRK5P ph1M32a8veR++oxO1KuRbtRK7PsiPmIx6q2g71HD+oFqPD0IRihqP+Elb5ZUsRJUICoR qIk91e4uVsCYnzNxojCt2HqGEfWTpl6Bna1Z0HUayscyVLCJXLo+bH+XEFQ5SnF9I5iP 8HQ9WqXSSPPAzuxePQOz/KH3QL5teL0iqnS0td6M+jmIL9Mxwq6ybeTzmMDpxd1k8Mv6 tPZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086272; x=1751691072; 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=C96JAGkPAc0LFzD2iy/4OszeuhNF3cJzB9GEOz3PGEU=; b=sFZCZsL6Rfx5jEHfLwSZHMWSeWSa4U59hlV0ApDvFKdXmUGJj5bmQkuarv8+8rg6zh e4qTAxq3dkuPyjCsgoVL47ueo22fgcsCTPgPdYOLH1Bf5dmvBzfywUqpEnReQ93Wbgl3 mdpi3ejuEzc3on1Iq6t6wwLORg25mrJNa4cU6h01T48AYJG/KfvaS+cSUcV2CIAkN3Kr D57uA8KFJS+wdtkNml+cMG+3sz6YKycx42xMePN7fr+RW9+//tLy2Z/K+47kpYzMX2mG Zw7kpIHQtVqN0h5zImnQZ3dkM9+9EZHyTqC7QHv4gVjl8/D0i5xCdDbTKQ/UbCpfhqMB b7Ng== X-Forwarded-Encrypted: i=1; AJvYcCWpWSriO+XKYyKHPDaWPEdBw62y4c+guAWP4PKTDU12iaUDR8efVF8mQLjLHqcpj2BhuTtXPgWWPMEKZfo=@vger.kernel.org X-Gm-Message-State: AOJu0Yyqc9gbnMOWyhY0HBF1r3cCYb18Sse9UkkfLkbtoAThPwLVCxl7 OFEp3e3WaPGUjD09ApoNded0L9R74ECp6oSEOpbGwyKT7C+W2yj6qtFj2trBUeYQqBu761DFjZn n2frQ/Xa97A== X-Google-Smtp-Source: AGHT+IGfUVNUkCqHuooZSLSEIRDc4HHAGWz/NrI5PdI1bYekJaTo1T5722lSTuTm5psui7KE8iVyedV6kxV8 X-Received: from pfjd20.prod.google.com ([2002:a05:6a00:2454:b0:748:34d:6d4f]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4f93:b0:748:e0ee:dcff with SMTP id d2e1a72fcca58-74af6f22819mr8017717b3a.11.1751086269923; Fri, 27 Jun 2025 21:51:09 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:09 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-16-irogers@google.com> Subject: [PATCH v5 15/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 72f9be5a3b30..d84daeae291b 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; @@ -1639,12 +1640,17 @@ int cmd_top(int argc, const char **argv) =20 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); + perf_env__init(&host_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(); @@ -1821,14 +1833,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; @@ -1843,7 +1857,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; @@ -1865,6 +1879,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 Wed Oct 8 12:49:03 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 45BEB227B95 for ; Sat, 28 Jun 2025 04:51:16 +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=1751086277; cv=none; b=T0BTIXzn/kKSeYnn/Ys/useagmd2HqQ0Kny3JAYZteWCcu57NTpzbuATlGgoyS5fUj2QWEuX99J5aIs8TW95LnIVQpvEzW3eZ8AW8j32JSG6NOkrPSkhvj6nPdjbzQmJ1FzPxuOFatz1vka+GyVkWTkMkOrroIyTtv7NBAbY0IQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086277; c=relaxed/simple; bh=zGchUZyMYUCy/6PHXS8H+m2lCEi8DBVV81961z39iQw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=HmTGM4GqcxPUEk22FcIIykfs6aJ5K8f3GWYi5K9vBK+ODZoktnlkd42GnEnLsHM0lxhJLHdzSDt6paax0wMe1Z18KI6kN8VrrIO3q+vMSDv/Q26J4v6z5Zjyhxa1l4naLnwlMKwTeTNf+fflGXkNlDuIEUF8BEXjJaDvWScmG1M= 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=iBDi2wrB; 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="iBDi2wrB" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-747ddba7c90so471546b3a.0 for ; Fri, 27 Jun 2025 21:51:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086276; x=1751691076; 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=cvuoZnm1u6Z7ygBbcSi7UYy9ZWPAMHjuY40VrWoNoYQ=; b=iBDi2wrBHXwxBFFk2rIY74ulFF2MTvMeVDACciklkRsde44daejnlrQM7xfrl/n1Vg h4C8vhyoit1aCfsK4O65zfxexCQLBsPgWp0bN7lqOd3fKRYRP7ICY1a+sbvXnNXs+aTb Fc94pLSeQKsQ5e+m3CDqs0HyoBDN8xAOUpF4efjzXbQ4lkJc/4zCLOlAGtBnuK69FkR1 5XOccDHwTVNsfVxsd2OQj70F1ONQsuXhxgnncKNopebUT7bMHxwOYGtcgBiTdGX9uOmF zWwPhlaMCxk8BMf+YXOipdRBja5BFEamafKgJyGcqTPn0iF7xykHwADrHI2iLfN58G+2 0UgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086276; x=1751691076; 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=cvuoZnm1u6Z7ygBbcSi7UYy9ZWPAMHjuY40VrWoNoYQ=; b=EXSGJt6z73vuYgi2sBklKVERHdYVZVDc2QVepqlON58tD0FGtOJfO6HURHkBVz+Zta ywijXjBqohQ6GmGx3HDMgoAE6ZcMWKJTV1bfjVe4xsOZkYZMIkZ7eZhFtS6u3GxPo/l7 irCI2SYqb9vrVXXtx5M3AjEGdOSLvyVjlxU9oZNf0mrh1MvebnW0a8vX6w3dXYEYRKEl jXyfJB8WgthoycbqLg8+++jQ3SKGXyVs9hRVByzemnwgOjmPS+SZmIaJm5TfJ3ghD8D6 8fAFA7ASm0u0ls/rcjSSYfMbEaLzSBUGzD9eKfBkAFhFvf9MFk3nlNoylFz4zKsKcAbp Qr/g== X-Forwarded-Encrypted: i=1; AJvYcCV7FI9K015stX7UMPw38M4gRl6HoYhoM1kDZs2iY5xtmKsfKU2Vm+n75ys+fE7FOvU+xfxpRkLQsswkoJo=@vger.kernel.org X-Gm-Message-State: AOJu0Ywb33XEC7Hx/hHrvQT3GOKxnc92lTClFcAQNhNAbou+e2+Sfrv1 2LNbK8SdSiPVHnAsPinOLTIy/LVev5Licb7HmLczPTanYWwIQmChLln5+2cLlY+vu2ES/vwXX1L go4yZr7tuSg== X-Google-Smtp-Source: AGHT+IEnY7Srvt5+zaQSY2UdlJWR8Wngw1SuG4VzVZ4q22R7wFABlrnlHOdX4NDruJ7IcnjBV/CPKw+ouxTj X-Received: from pfop21.prod.google.com ([2002:a05:6a00:b55:b0:746:1fcb:a9cc]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:23cb:b0:736:4d05:2e2e with SMTP id d2e1a72fcca58-74af6e60f24mr7840029b3a.6.1751086273528; Fri, 27 Jun 2025 21:51:13 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:10 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-17-irogers@google.com> Subject: [PATCH v5 16/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/tools/perf/bench/synthesize.c b/tools/perf/bench/synthesize.c index 9b333276cbdb..79d99ba50284 100644 --- a/tools/perf/bench/synthesize.c +++ b/tools/perf/bench/synthesize.c @@ -114,10 +114,13 @@ 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"); return PTR_ERR(session); @@ -144,6 +147,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 +158,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, @@ -173,10 +181,8 @@ static int do_run_multi_threaded(struct target *target, process_synthesized_event, true, false, nr_threads_synthesize); - if (err) { - perf_session__delete(session); - return err; - } + if (err) + goto err_out; =20 gettimeofday(&end, NULL); timersub(&end, &start, &diff); @@ -198,7 +204,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 Wed Oct 8 12:49:03 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 329C622A81E for ; Sat, 28 Jun 2025 04:51:18 +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=1751086280; cv=none; b=Ba2j4qeJk1Vxqc5zln6phy6dfBRADdCvV5RVS8Nl8Tyo42pbmaSeKvUpAtZlAwZZeb7RtyMKYJp/byzANy8yG/GG8YGNSqGKZyjpM/FeK9ehBc252r8kW0M34vhMvXwBnyVlp0xhNz0STEhILX+kAA4dvBDrqGyir+biaEl+Xgg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086280; c=relaxed/simple; bh=K+1J9DOC96kiAfgOJ+dEW4omGKvaRGy1l3ASnzwBZLk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=paxwIDSNUq1w/3t7yYDS4BuC1HozGOhdCKBgPyHBDhrB6tGeHMrljumiGx2J2leTPurwG8ttQWlpCUEnIAb+/E2GZrysI9eRUS+lAeWamh5BhxNECRrjYVgafkIQstrVJ/rhZ8rnkLs6PkhoBnNI/TTFALZI/5Wf3LxJW1TBQlE= 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=O/bdkh9m; 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="O/bdkh9m" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-748e6457567so3018999b3a.1 for ; Fri, 27 Jun 2025 21:51:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086278; x=1751691078; 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=ReFJ9O4xKROX2HGDj/nIarZNxigTNc/RAGO4Q9N4u6I=; b=O/bdkh9mxn+qDTekqHcahfai04m9UdT+vVMdeYAK5cPWRbTAIc1dmm1hMQ/xKQTcWC 92x1R8AG7nmeYKtDcUbIfZRprytupJvCsPiBKkkRxUFdcoDmmyyFxt5a397XodYRRKBL FSjv5HQiyyax0M+Vd7ixbEP0lmqgikxXP01Me+V3tpc6YM3s72Tl97yegggbq5VwMCcP flhMRuMLg1TKUVaIQ4EygVJHNXw1jvfBPJeVo4oMlByHA0D49DVnhJuGtUD3MhqFW/ZU 8n0DEil/3IcjROQuJtdqLQdxMx+bf2WABumtBp2qqH83LTH6j55MXdXv7iPG1r7pmjqx 4KdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086278; x=1751691078; 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=ReFJ9O4xKROX2HGDj/nIarZNxigTNc/RAGO4Q9N4u6I=; b=Zuk0WN5tUk2yv7/FERzO2Fe5ILX4n2bKG/JFvQDryQ+tm/9jAlX6tRp4FMZIx5AOSg OCpOqmgVN7LMwULT58OlY+qvsL1G0HW0PX9kRq61JESqQPXoDANs9KXNaWIwM0qQtsAE ymB28rzWSOf7J7q6+Na6hwk7d/rUlJalkcTmDOH6AUR/Ar1Yr464qebrgcxisfDTal44 OsiMfErom+GdT/1r/apBChO+VdTY+s97CVcMNNgla4Zf92gXhjSuTRtQ32rulDXx3NqE unHa+5teEVGF9itjTtRHIxRP9PR03unxj8Oare9dObcHtakXTvE66TGKiP+hi4k04p9u nw7g== X-Forwarded-Encrypted: i=1; AJvYcCUZMrDIJz7e2gkeNaU4YGstaIwPyhNMtPWow7c7/DCZbR6pOlpuNqhd3F4yR61kCtITdqpp+aUZPkpv0Ys=@vger.kernel.org X-Gm-Message-State: AOJu0YzKYJRozmhBzna92TZ0o8RzAYAGGg1UNPXICIX+f0KNOXFFuXae ikgVA37XQtSGEu9kC0pEcE/qL2GMWHNwbOORbCiNl4I6jlk3l25h5zfrVDimwm8qXmJimWf8J1W 7I33VeDzm3A== X-Google-Smtp-Source: AGHT+IFGvelhSrCM2RA5nnBmIxvyIpSp0s02cz5WyYFv8AD1s88QjzS2QLJVoTKFROWcFh1giXEuCCk3k2Cb X-Received: from pfwz25.prod.google.com ([2002:a05:6a00:1d99:b0:747:aac7:7c2]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:700a:b0:21f:54e0:b0a3 with SMTP id adf61e73a8af0-220a0893965mr9201705637.2.1751086277663; Fri, 27 Jun 2025 21:51:17 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:11 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-18-irogers@google.com> Subject: [PATCH v5 17/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 9e2439f9bb00..d52f21afdeb1 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -143,6 +143,7 @@ struct syscall_fmt { }; =20 struct trace { + struct perf_env host_env; struct perf_tool tool; struct { /** Sorted sycall numbers used by the trace. */ @@ -1983,17 +1984,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); @@ -2004,9 +2012,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 @@ -2015,6 +2024,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 @@ -4456,7 +4466,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 4b2461e93b2b..e327d892c725 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 3c87aa6f7d3b..ac77ed0b7031 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 Wed Oct 8 12:49:03 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 F0D2722B5AC for ; Sat, 28 Jun 2025 04:51:19 +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=1751086281; cv=none; b=sEfwPzFZqrPSGRq1y3I1yUMUgqIbAQYNX8lgI9mlIcsq8GRwI5MseoFHZ6D8p/MYwrF09OQ40fcfaLaiTzX3IIgBAscgP5uXkvDnSrUFMWVyix4XkQlkVLSgp07TtzPaEtOwJI0cuPlBP1ixDktHjMzcC5pCG+jLFf6O8nkn2JM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086281; c=relaxed/simple; bh=XZ2G4kiVjld4rU4LFsnLYgXf2Edy2O94yr2BpTWHjrM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=obO0R/mqhA24y5o/u3ahNRgs5UeEIm/8QM6aIz1H3RBnnIkleHbSeGarhHQ3w2MJ97CfS9d8K8vVflQr8Tcu6ftgRCKg+Z7tKJ2jpprpHCLxBcamPG68kua2ySvyNqIX7FrQsXEQE5kSrMkUmvSnwA8lqdgLQxu7Sm2WYkaWoa4= 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=Xa1G2V36; 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="Xa1G2V36" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-748cf01de06so1350452b3a.3 for ; Fri, 27 Jun 2025 21:51:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086279; x=1751691079; 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=igXQM6BRQW3014Wvuqhh3drIYdWuvzh4LJQBcoyEMvA=; b=Xa1G2V36UbE6ecX6ZmvwWONOex3/rxpxmva18laYL2ot7ASqMS/qt3SZAFkkpKJ28A AcHhdv+jFCNqHGTTbN88MWCwNwGSXQg/ojivOLQaI2xEBYLnOAWiMhXPR8gflSAeJaTT kQsMRVx5ivu58LrcbtJ+Ttq8b0gMk1u72pzH1Li9i0Km1ZtBDvGtTrgts5B1nIG9I0qa wDmFsTE4y1VJQ/0qrtwuh4ZsNpP5kG9VBvS06ny5fdxgViXNLsQJ/bgGKJlLRxeQv819 XmWJUU2tRFAcdOw4Fp9yPMnt9UiUy59QCXnxLZufTRwlPPZHJ+k3qozDD55z+9WcGAGK VOkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086279; x=1751691079; 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=igXQM6BRQW3014Wvuqhh3drIYdWuvzh4LJQBcoyEMvA=; b=h9ACf9L84bwLoAMZ82f1hL4iQbRu25T3nBKyqHZyO3xzopewjeKbqAJFal+Ytr2kn8 MmwD4xXbXpdZfzrWEIOuL9EzUwd5PU74+ludVp68Eo5903a/4ShttZxM+865Pu87g5st fiS6AyDUs4XgllT+yqcGC4VTbFDBb9nCq7piHkY71RBSfGLNQEU9IzylYiA4FXqgiQrD 93rpEPwyN1sMzk3fDT6DIYuRSc8pZceogpK1He3bsLnOMemufsz+daVEUvMUUWGpHGAZ WDAvX+xFro6SVWaUj1onM23OAfPllP2nf09yr2s4p+wQueZf/5V1cpvgP6ifXd6yjfwl Y3GA== X-Forwarded-Encrypted: i=1; AJvYcCWelzELD/obWg6Ra9ZYUTf4QpxckB3hGXCRVePi9V5AFtO7jBQhcLQPDB6Y+zD9P1TpWKkrgbdyqy7aSlg=@vger.kernel.org X-Gm-Message-State: AOJu0YwCI/aM9duB3mhsuhVzOH0e4uN2FmmIn7/xGlhctlGq3b3nbjpA qm87KXYPBmZf7ogP7rPB2UzB9JNHVc3cflX23qfETrtdM4EWioHjVDjhk/ZeynVFdJwudzn29jb amM3I3RUtSA== X-Google-Smtp-Source: AGHT+IGlr6aNseajtUasZEJx8sFDfiqYdn+3ReaGiasBgRfrtEPijj3lkiCuoFZfZnQw3dWyqb7RcC1LSJ5S X-Received: from pgb12.prod.google.com ([2002:a05:6a02:340c:b0:b2f:64be:6881]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:900f:b0:1f5:709d:e0c6 with SMTP id adf61e73a8af0-220a17ef512mr7681833637.42.1751086279488; Fri, 27 Jun 2025 21:51:19 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:12 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-19-irogers@google.com> Subject: [PATCH v5 18/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 546c54b34155..362312c764cb 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 Wed Oct 8 12:49:03 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 E0956227B95 for ; Sat, 28 Jun 2025 04:51:21 +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=1751086283; cv=none; b=bXSgasn+o6roI3qrM4+eb9896t0Brd6dYbUvSCcxncPZ5+sX1G3SmLKAFYASB6IoreOHUvU3sj8A6SC5Cg3yqYpgXQ2aub9rN8Levbnha4+1KEIPXVofi6q6QqwA3Egk5L0twtUjnG5ripGJsW7HFdN2hba3LIbcILe45hXFnjw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086283; c=relaxed/simple; bh=rzX8B0iDELZ/bYw3/jiUDZsS7oa2ckXn4WeaJ/6cDmI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=gi+LxT0sjeXMtlkMKMwaKF47mDBQ48ecYj+gOtPwDzlFFPDHq4nV3wgypcmNHss3013df9tbL3X/1MVnRMM1ZNSzkb6ktHonxhqKAw5MtOUEkLOvZvo6/3Cz8LuSlEAI3nP4nRYxYPaYPZZy9S7og4MDpg3Plzf+gs6oXwjd7ms= 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=1/3EcPu8; 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="1/3EcPu8" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-74913385dd8so1106610b3a.0 for ; Fri, 27 Jun 2025 21:51:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086281; x=1751691081; 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=zuXuLHVC8mUAXN1Rk38gtyje6VxPsjMfZ/jwecza8r0=; b=1/3EcPu8SQdH4JsabudDskflkSiQ5Zfk95PGfY7PMHu7zNnePZA1FVi0m8foTnKiXc ZY0kraeKLO2DT0UFOMBAQwzoPaKnRZjfXs6fbPnXASF0V1bsgQww5IX30GJ6onEaxt41 7WquScZRj2k0DJDrknSBMbubMXaTCPjd8+VyrDREBK4VdhSi8eHRq6Lijxo2bGgy5eAy 3EpjVoc+imwIUh7HMv0yrE2s0Dw2HY6LnX46lJNhQVI6ltyXkbQXyqMe8F7HSOiuo8GN UnLfS/M5V4YV5z0WibBccQGrXWDaBHgaD7sxQ/OFpHTLWzVbQrJKZBU1njOjqNiN6Lx/ Ly7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086281; x=1751691081; 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=zuXuLHVC8mUAXN1Rk38gtyje6VxPsjMfZ/jwecza8r0=; b=kE8hcywRe4zoTf4Yojbxi0gDDcdFe8T4Ym16r7ba94wfwcvyLw1sGkPluIXiv6hbhL zX8wocnj0tHTSJRj2FSwCLs5Px0boCoXCsfPoWrlHjj2AHw+aEtjZ1M/joen0f2lN59P NQhwCVZxVZLeW96ABQFbEniyGDcEZQzfp5yop8AmUHhPgygOObgDfEiZgopYZi3QMXY8 AdVG1lqb8qfgBcVX/RBqvaQ7QCTqOTJNoNdSK4PfmC+mS7QMiYc5SNFt370wIqfJfhiY +l3BgpqrcawVdShiDKoklcrCSQ5HaxuY3IoK9vKYHnqFnnJn5x5CwSLLyIbSWL5bW1hO bzmA== X-Forwarded-Encrypted: i=1; AJvYcCVoCPOMPK52cNqGHNRgoRMD9erSK8K48YpcIpZYQZx+ZERPy9aZQ3p2vTxROX2mDsqt/Vz+gCEfYh2T8DU=@vger.kernel.org X-Gm-Message-State: AOJu0YylcLk3UtBicFtSa/fq53zBNSvg+kELB6Na/jkIKV+0y+gpQNHz n0neIS2tlXe4RKprAzm5H54bKok8QwCkDEFsw0YLblr5bwDV3mDcplxM69X85ejA156dUZyN/qK DzfYLH8Q+4Q== X-Google-Smtp-Source: AGHT+IE0qxcnnxTTWe9CHDCNPjcV2j5Ls+Y8fN+NmEKyKnoatl4vzJ3R6yfnqSJhftKCP5XZWld0LGT3E1t9 X-Received: from pgnb21.prod.google.com ([2002:a63:7155:0:b0:b31:d4af:e567]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:9186:b0:21f:5324:340 with SMTP id adf61e73a8af0-220a17e9b09mr9968310637.41.1751086281226; Fri, 27 Jun 2025 21:51:21 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:13 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-20-irogers@google.com> Subject: [PATCH v5 19/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 d52f21afdeb1..da94cd28c8dc 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -2904,13 +2904,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) @@ -2996,8 +2989,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 Wed Oct 8 12:49:03 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 A8F4A22FE10 for ; Sat, 28 Jun 2025 04:51:23 +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=1751086286; cv=none; b=az584d2mVUMtxZKsIyYS5jvHtR0Qp2kAfR5j52vH/UnU/dBHuX1W7FmMkCY0JBjlKIvgecRjaKmF122Qycd4kPHqAtR/+BPDn6txmVZ5jd/ieAPFDJSpGzpViYwD7XmmCa3axYPITUsHphaqLdcXJ+2h+m1jWnLt9leKXn7XjXE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086286; c=relaxed/simple; bh=1mrcw1eUzyK9YbP9S7+x5wWLBu9678+qgj//bB2V2FY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=XmFTr1w9VJsGPWl37MQo+ogGitlxnNYOrqCuQsGkTtlBCZ4rPF87fuwJXgnR0YQp3A17k0+fq4IOlhx/kskp3ELs8QO9Kvr0mIYn2TNjMIAPoIbIFXilthSPFP6RB8KUH2yU8TMi1GriiPVKwpXKowdWs1tNvg0fV+S4gHi0GpU= 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=xfm84ihi; 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="xfm84ihi" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-748f30d56d1so1500058b3a.3 for ; Fri, 27 Jun 2025 21:51:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086283; x=1751691083; 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=sF4qV4DgtjiQLBphxxTlw2wew86VLfxLJVROJefkN+o=; b=xfm84ihibwnBJ4eTE4fu7t36JUgWpfdR1498ZK1lZ5CGfE/0Ti9HMipbLEj2/qI60H Jv75/pPOrnGnlc5VkkarQAaIwd02sjR8darU6AGykMGPVzKOwow91c0xiQKVnjh1jLeD Z91GGaPZtnlr+Up5vf8mhgcaXbvsl6OT46PWQTROhGbY5rnqBfl2ROEy41TibNB9sCUP KSBU41nMeVVKAzk0jkqOgrIAXCpZrv65it4oWNvBf5wOj4AVIp8nbt+CEli24v8fiB0h aJj40Lg+5reNDpHnCHys4DQ0hHwhkj8XJEgx5/gsgt+r4xUG6hXFFME+JPqxJUAnSvvB K+vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086283; x=1751691083; 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=sF4qV4DgtjiQLBphxxTlw2wew86VLfxLJVROJefkN+o=; b=wx4wnGkuLdeFvwuJJUxRpfT3T1HWun672PpNdllzkl1AoFM1ROP6eiu/WRG4CPgn4Z jZBz71YMdgLB0bigEurRLZrOBopQPsDfyWACTQMHyDOo+OveBdGuPxzy8Ze/Wi4Hl/pb DDPgbGRFtYrXtnlBDVmyJEhKH42vIvkuZE5AaOOMLlYVus0CYUxM8xQqrg13bwRUQwOh uQnA750yV2IVRIj/K4ByUKjuee1qXfDHpJzvV3eaUXp813+0b5sssOUl2j91aRAsg6pz pNuPGSloIP3qNp35d8RrCQ2721m03SI6PctkybNE8jYDc2Wsqqv3ut3L/WIeGKGiyztP 2DkQ== X-Forwarded-Encrypted: i=1; AJvYcCULl8v3bXHooaSt3ashc51es36wqjfhE46SLsnrAn32Qwz9ea0rX4/XUnzBaMz+iHsRrX6BSBVedJkQ0DY=@vger.kernel.org X-Gm-Message-State: AOJu0YxSD23qLNvCZV93ni0ai+ooskQwrdfmsag9xfQ1v5anYRt4JjRb jGR9WEjbYLxkwo0AqMSv813qKNN8sDapf0bcrfYCJr2E9G75vgOG/7TxkU7amw9ayPHyfWO6Yyr QPg5lh6QWTQ== X-Google-Smtp-Source: AGHT+IHN3BGfXu1/P6gldvYF17eMS9Ry+qQuwL6y5uQS3sgX4NqfOXWImYMrFh5fAFdCo1+ETJBjX/9l5Anx X-Received: from pgcc24.prod.google.com ([2002:a63:1c18:0:b0:b34:c32a:5da8]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:72a6:b0:21c:faa4:9ab8 with SMTP id adf61e73a8af0-220a12d167emr8525541637.10.1751086283101; Fri, 27 Jun 2025 21:51:23 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:14 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-21-irogers@google.com> Subject: [PATCH v5 20/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 887a6fb7104e..6f1611eb4694 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 c90c1d717e73..ce0ad14535a3 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; - void perf_env__exit(struct perf_env *env); =20 int perf_env__kernel_is_64_bit(struct perf_env *env); diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 24c93ea5ba0a..988fe5c4137a 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -3849,7 +3849,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 39da4ab768a5..df03743ac2bf 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -193,7 +193,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 Wed Oct 8 12:49:03 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 C4E6E22DFBA for ; Sat, 28 Jun 2025 04:51:25 +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=1751086287; cv=none; b=OeQVmiXKEzZqgIPro+GoU0CtDOq5OEa8YZmzQ+XjpM6h4c4D3UtQJ6vSO9xXZeo8Tw7ZLY2nDaZmjo3TOnesvvo2aH4ys7fiS+9LPywdS4Kf0LPAI5V93DzAzA4rTLzwRZc7maX1zoMYKvtD1U58Hu7EvXlUDC84RrwLjZ80yQc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086287; c=relaxed/simple; bh=5FsDw48buAecwtMy/hBT70kgQGSy0inCH2lcTBltcL0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=lJIWjOE/yryFq1osTOVOl1O1weqd6+7wKbhRGO00uVqrK9ZjoEGwiTDd4MYQ46zVc2mhxJuG3tAyQxqd7u/MzKQ81oPFS9C4f35Nx1+4hRTA/fo9cjfrimqh6vAYni30oP0MErCs9U1ZBo7gdZnadgPhDZSvm1AoQPKmoIOyQpE= 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=KvV975Fd; 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="KvV975Fd" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b31bc3128fcso1128420a12.0 for ; Fri, 27 Jun 2025 21:51:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086285; x=1751691085; 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=e+GqeQQJ4Z8sy69KHsPcUjo7exe6nixy2bC0Qa24k6A=; b=KvV975Fd27/rQGczOJoM7jWtLFpS4AJDOERgrMe1dSKEaJLMjPQVYhBcMq/kDRXhKX p3queUxdfldpDOenvsxG1XR+DP/95PqxMnTxpKfe5WGVaguHOIVcQgwXkAtNkFSOUw/7 SpV95LSQEUaCRoOfW8z4cWqU4EKun8QfpVBaopFea8gkPfFD2atON2vpQr9nG7NvliGP 4nHCdpQ4Jk6K8rLPmujuPx/nyQgS9ierjqyG+Rtj1J1Dmz4q9g3IqXpwAiJvu1mg7I/8 1H+LT+Jba6rm1lX32SirdxBnW9x4s8LaToxH40ZgQSjUlHasw+ZYyes19uJhc+rK+eAJ Lseg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086285; x=1751691085; 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=e+GqeQQJ4Z8sy69KHsPcUjo7exe6nixy2bC0Qa24k6A=; b=Q1f+t58454gn9OlAs0/DX10+yxUrh37VgU5s4DCM8qxZPTrCi5aOf+k18Bf6NcwpAh I1UcoK5PMwe1DukAGqU9xldDkOATJhE4DlKmDke0OirJ0aZ8hbwMTflBrgJpjVNHx4c+ F2lrueYn2N693vmdXXg3GaPjteSCq+UbuYSDebOoljbQmeQNaYFRBupZL6p3dX5IOoLA ZDCxpn8DxhzqO+KkngVmAtNO16Vx20b65hzqRH2hiIs4BX14Y332wTsCU5pJkXo/DUxw mg7bRLX4qBbNDuiUvDfORm2cNz9au0RU3BL28p3AuXjQlJWBFy6GYXmOHTbIZYIg1bLk SUvw== X-Forwarded-Encrypted: i=1; AJvYcCWQjBd4JjAPy4IkUUbpI0fpgcHBWIsL9OqP3H0qHK/M1krpgYHZTC/0H8ILJxg9tcqELjwvMztNEaqVRvU=@vger.kernel.org X-Gm-Message-State: AOJu0YyVIh+78OhyaJ5CIKQMeE5pPVph+cgqgF6kZHb2WRVxBa8uFa4T l0du9XGpYAyYdiI4vHvDjw2IbhooqsZP7GX6ozra+gTHWm5NnkaFcERdI7HK+q3YwX0ufM42p6Q iR03O5VfqCw== X-Google-Smtp-Source: AGHT+IEDncTZQEra4dxJ5Mwi0TWitflYwn8HytTMEuDCmfO08N/8SUgMvb47GyTXjI3vLtSRlZrFJH0DFLZD X-Received: from pgam16.prod.google.com ([2002:a05:6a02:2b50:b0:b2f:6348:f715]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:9154:b0:21f:77e2:13a0 with SMTP id adf61e73a8af0-220a113c18emr8586255637.5.1751086285071; Fri, 27 Jun 2025 21:51:25 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:15 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-22-irogers@google.com> Subject: [PATCH v5 21/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 2c25eda4be26..f7bdf9a00d00 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2253,7 +2253,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 988fe5c4137a..9f1d7ec0386f 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -2847,11 +2847,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) @@ -3237,7 +3244,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 df03743ac2bf..daf72362d26a 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -1100,7 +1100,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 Wed Oct 8 12:49:03 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 8C9ED235055 for ; Sat, 28 Jun 2025 04:51:27 +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=1751086289; cv=none; b=uezXMnUsFaP+HC/Jr1hyEdkTLHJsTlyw674CR4ZcaX3S2P8JNymdTGZgSvk+9AjkplobadohPRfYdEiufzxty5VCA/MoRnHshZSqusVurc8M/jOI8CFn85eezupGyyxsaMYpppVbN/afZR/7xFi2vz17OzHGPaR9ZCehLiutSeE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086289; c=relaxed/simple; bh=Ojj+JeDJfwzZseKji2aeqMV1uVdeV/pKtZURhSrHk1Q=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=P5/yBBlBnOVTLtVdeY4a7r2NVwfB6QuSQW2pYjwvY2cDUt34fof3geBgubucIaKDhOiUbQM/eGYbG+UyKRFb70TVFXZIokf7xBGGqvg2tsHuLyE2LQwxwKvpc3jeoVTbyoXbbidb2QHpIYaqNvVkxe2ppP1wIZbfMYGxiH2CIMg= 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=lYbq2ojQ; 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="lYbq2ojQ" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-315af08594fso217359a91.2 for ; Fri, 27 Jun 2025 21:51:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086287; x=1751691087; 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=ROM1YcXEcmLfJ30peSeSKXHVkl0I7AqofeuRCtlKQMM=; b=lYbq2ojQolVV3jOAaAfhFNroryte1f6jgJThXYQAx7Buk3wPrK80oHRXuPa60vh0iq ZN6T24GnMvAO6q0YT3Ajonalcg2+zpPs7Un+PEABOwyTSCbJHWxolEv6bxnzoUSdd5hQ AkvTHsBYsSBt5sXkP1+0Yuv2Hon00Ay7r1HL4NRoQ+mrH1Xav0IdXyFoWY7S21c9l2Gb IsAsEtLoUp74LtFgVQUHChTZiYDvTOIHlbyk01Uzfc+lOXNQMrjFOThp4fznPCKFJD4q QJP9g1JwIFDX7+hFpy0pZEUmn5iX2eeIK3DHr+JxkujU1VSkzfrXEMYQ4mzGJ829Np/Q 14cQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086287; x=1751691087; 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=ROM1YcXEcmLfJ30peSeSKXHVkl0I7AqofeuRCtlKQMM=; b=SCCvdu+0c9aVwlbirZ/SskNWOQmbH90IRWZDIyEr79yT5UTEM18NL5rH5MEfVTjC3t 9E51C9VN3zDR+GXhen+yrJlNBga+YeJ8Xp4bzQotjcQyIBfrmEt0S3JrO5YW9KiIZcq0 fBSYdka5o186SjbHXbcMZrS0HHuVmzCgm8SBF6k8xzo8JbJqTRD/uKgOvTCP5QJmYqLL 7tx+6UoGxdjZKCeaHG+c3kAPjzl2mBrnGQkAjaWWfN4ZElsNMyjhVo34fyET5BCBeMVl x57KV2ecXQO1P4BT6UKdiQFY3rUn3gwQ7180iXPGVSo7IWfHE6ZJv0isQ1y0vCuTJPOv 46MQ== X-Forwarded-Encrypted: i=1; AJvYcCUZPsHJbZTgVmpCjOEq1CDPYOdx86H+s+aVdd9HLcTGG8dE7dzRfQqUoGfPIYNPf8zk61IT4EW4X5aVGew=@vger.kernel.org X-Gm-Message-State: AOJu0YwNRg/SYxtoSGeccg2hDLzHkcKaoy3dGWepP2Dua7ulWD29z2R6 h5OALFbf1VbaH1ZIeVml93bDCDHH0Y9NOR1H+0VCe14cot6IT71ZV2fr3wQ8E6GHRs8I1fw/bXu eQ1jX0qlg+g== X-Google-Smtp-Source: AGHT+IFvctXnxx3txIwj7PpKY62G5ZrIpjXNEopJtJPgFp0AVAYKnq+YWesK+m4rJNZniziaUtpeWohm9wH9 X-Received: from pjbpv11.prod.google.com ([2002:a17:90b:3c8b:b0:2fb:fa85:1678]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2ccf:b0:311:e8cc:424e with SMTP id 98e67ed59e1d1-318c925ad06mr8775709a91.24.1751086286961; Fri, 27 Jun 2025 21:51:26 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:16 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-23-irogers@google.com> Subject: [PATCH v5 22/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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 5e00cbfd2d56..4c27b85b960a 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 Wed Oct 8 12:49:03 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 922FA2356CE for ; Sat, 28 Jun 2025 04:51:29 +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=1751086291; cv=none; b=ab6qg9fJiSy/ddhJQpGhHovtTOIHxS39ZtUi8pQrxidjZWHqP6H4hI7+54lru+IrJ3rxlG7OMUJPntH9nmjpqNo3l89OUf8MjDAenxZ+EpIoNiOrySgRMnSABNE1a+ld0yOLCVxi00Ee+TId30GgHLKoZd8Dx8RVPZRbcDuANmo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751086291; c=relaxed/simple; bh=xqmvalg+u4nxOm2xePsnh49T1VypsVG5YhQTwsTcUAI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=I80/dl8rrPfq5EA9HCyphyknE1Gtz7nMbRADFsElpcf8AanHeIv8rrFss7NH/hEFD+/Ke23i+FC6MQd7dWHFzl99KpqiHcwcH9GTGJ1ijF7nuHrtY+Qsa0cou5SsgiNYV9TYbLY1ozp1Yq1momib7fapwdCDXvCrFjdaHZgUSyk= 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=Clzktt/G; 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="Clzktt/G" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b2eea1c2e97so2263176a12.2 for ; Fri, 27 Jun 2025 21:51:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1751086289; x=1751691089; 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=WqNYOJJr7TdYpxM37GBRppdBcCl0XQUl/XgR+B47l2U=; b=Clzktt/GzFp1j82K2oRYVrlRJ1il3YXnKla+axBZgHkzJCaxcxSe8XD7DzasWD0IK0 cCwhoZHSclwlOpBs1W0XDTSrTbzJUVcN35CXrbl67JEaX9Jhu6b8pbvoLnFFvBRos8ak 0FOchiMY+ZhqGFizJEsS4IoVRWprKGbvjFhuct2a3nSachyXUbMsHfodu3XgItnAUqQ4 Rvc4RpKjXB+t0xKWBniygL00oq1Pn4xFRjENYwmcLma/w9Xl9t0azYxJWoYmRhhdCIRK am+7GGKDadaFGuZdghnHJXwyOOMraYVn2frvtlr11UDYkZsCVju4INmSRT5MidBtCbo6 NpXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751086289; x=1751691089; 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=WqNYOJJr7TdYpxM37GBRppdBcCl0XQUl/XgR+B47l2U=; b=kvH1EdTlIXd/PAu3JiDucpRAKIw0MDXoJFkyuFqBEHb6m+F+wcdTOySowPCMdHs/bi 3ISuJkqySHSihuTjSU8vFGba8Hw88Xhd3v/n/nV0wvY9RVqtKg2uxUU54rdtOSwfpr3w pLPpBkkXJ0KwMNiu6dRm2dyncST4fs1Yld8bz2ri8SRXy4J9H1PnhxYSZ39StLLAAdnE h3Ol85aWT9r9ZuKIp934NOMLhpfgR4f/ujhUBRCuxbmSblM7k1lxMDVW0eXRA389nRDM 4p/Rn7/O/NZeDaXBYc3PMVRhDL+uN28+EGdVXf8asipSiKYSkMDH3S1bqOUuOpsH9yBs 2Tdg== X-Forwarded-Encrypted: i=1; AJvYcCXxKAs2Q+oVC8PdhdqLs8emkTD5QRVOkTggLbtmjZF0UFSH4o/K2ErCyjrJRIrSGNaMJrhYNCJboP6vIlE=@vger.kernel.org X-Gm-Message-State: AOJu0YyTM4y33dhlwZJEggCSqiH50gKFYksdJnBBgaZXtPkoGUc48BP/ Fq/9uMnwwmxsyw2ZTLL/W73B1CIAy7rsrRQgPG+EjUsW3fz7Mln4Iy5lhyuzPB7hHYocNLWvjQL Ex8N2VY9oRg== X-Google-Smtp-Source: AGHT+IFaE6w9PzRkniqIOCgT0eACbVgk+ooIihEYWWdeVnQPSMZYtY0TuBndMmfBmfHrQ5dbtkf18u0+o26n X-Received: from pjx7.prod.google.com ([2002:a17:90b:5687:b0:311:46e:8c26]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1dc4:b0:315:af43:12ee with SMTP id 98e67ed59e1d1-318c9231818mr9666895a91.16.1751086288862; Fri, 27 Jun 2025 21:51:28 -0700 (PDT) Date: Fri, 27 Jun 2025 21:50:17 -0700 In-Reply-To: <20250628045017.1361563-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: <20250628045017.1361563-1-irogers@google.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250628045017.1361563-24-irogers@google.com> Subject: [PATCH v5 23/23] 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 , Veronika Molnarova , "=?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, linux-arm-kernel@lists.infradead.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..6f24540bdee9 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, &session->header.env) < 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 d84daeae291b..608f58c753d8 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1759,7 +1759,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) @@ -1834,16 +1844,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