From nobody Tue Dec 16 14:36:05 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 E52442459DD for ; Thu, 29 May 2025 04:40:08 +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=1748493610; cv=none; b=RBLSVKxDX3Rn1zTZtFRXt/gVBbvK9KlZMBpRuFJ28F8tF+NpF5koV2ydKiJN95ZqBvfCDBNeyMMnlr3qSwutyrnYYj1gItirN4/p/9+GYRw43g2hTRGjVXSs+0QlVqOIfm3BH0nzYaWT9imecfsS7zPqk5w8CoovwZyCoxcS+Lw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493610; c=relaxed/simple; bh=9wPoSZifE1t3wUFjmwqAikT26nrZz1wb8X2FZPryshk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=FldOi9PseExblPcFXdXG5on8dnJgrVQ/aTD/ZXr/8W00/XaQaQRFf6wGd6CyiP9LDLAg69uEBkiOw6QVAlAEBYTehAFVjfvxBU6QsmLK0XxP+wqJILdoQMxdyvZmIGwiluZqL6SSBxYUx4gsp8A0GS4GnWQOlHygjcyCo8rc3Rk= 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=GcgC0BeX; 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="GcgC0BeX" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-22de54b0b97so5179765ad.2 for ; Wed, 28 May 2025 21:40:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493608; x=1749098408; 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=722dErY8zW9Hiat6E75/pw12Xy7SEFMoHYruy8Cf3d0=; b=GcgC0BeXzYems79xGgg3lT+6uQMkagif5+rMagHOOcz4QTWaRwtZSYRr2MK2BQU20+ EfxN+46vM5ZWjBlzqKTLsk0D4GDDspUyvJJcLYl5Fu3p9DmgHVprtq8oZIfpKMsqFzE9 kUGh+vDTXb3gDx2QnoJp5SkW1G/KtvwTYzeSDCgGpAEYJej9SndxUxFDBCu4WP9yY/Lq dXMbsDYzLC3sahuGrvre50sTQyRo38X/Rz3FkiqtqTMcnja54Z0G/FL3fTMGzv1n+4zz KpnrGT+kHTup84G1hq1lT4t+H/i/4kSymB4pdbLTwSBxLmcwVhedsMLetW2PyPx7/s1t 3gbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493608; x=1749098408; 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=722dErY8zW9Hiat6E75/pw12Xy7SEFMoHYruy8Cf3d0=; b=puMgvfjHkJn6P6aFapy75T5MIMQVZeRqdrUmuZEUDiC9/0R2q/bQjlH6L1aLnTOIcq IPYgIGE8uFB65fuzmZbFI69aeb0DF7vxdFLN6KO8qJcYpniNdnyKzEsxBvY5tlOl9yt+ vriz3b1j7S6ajTGjfJ0tZb7xBP24uBQmyCWWZcjwXFZqj7QCL34uwuN0JzNkJiJzdIBp LhiYIgoVEVjsryezy/5mP9LivGwptmX8Q1zC2O0DJHE0bXBS4gV7/sUJ2C5gwNI8XXvY cDbgK8CohRXk8Eg3a5M+McYoT7reXmZQp13m8I03ZUB0Gv+qD02EARJ9MoErnhQwSKfG fUUw== X-Forwarded-Encrypted: i=1; AJvYcCXh0P6UzURyIFwbJN67z5q/Twu6akUlGECWyFHncam2imOBltLa4fd7uqmghjD6UvPMzvxZpZ0zZTIxA6g=@vger.kernel.org X-Gm-Message-State: AOJu0Yyf9x3AVfVjtBw7p4w9aS/bxIBLH0Q1T0UEPjKk+YzGluBv2ixZ aaS3nZcaJHkxMZ8JjaFqwr9Vptz67IdlAAOlLhDBe7Z7WljQNLwdT3G3rzFxYwQ0e8/KyS98C8F gjzcThtwU7A== X-Google-Smtp-Source: AGHT+IH7dpEuGoQg21MoVuoQ48ifpe0WcOWCZSF02Gb8i4e8aMbd0il+r7EkdIyA9k85aoSprRbowJvEHNyz X-Received: from ploy13.prod.google.com ([2002:a17:903:1b2d:b0:22e:5728:685d]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ea05:b0:234:e3b7:5d0f with SMTP id d9443c01a7336-234e3b75fabmr56521685ad.0.1748493607900; Wed, 28 May 2025 21:40:07 -0700 (PDT) Date: Wed, 28 May 2025 21:39:37 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-2-irogers@google.com> Subject: [PATCH v4 01/24] perf callchain: Always populate the addr_location map when adding IP 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" Dropping symbols also meant the callchain maps wasn't populated, but the callchain map is needed to find the DSO. Plumb the symbols option better, falling back to thread__find_map rather than thread__find_symbol when symbols are disabled. Fixes: 02b2705017d2 ("perf callchain: Allow symbols to be optional when res= olving a callchain") Signed-off-by: Ian Rogers --- tools/perf/util/machine.c | 6 ++++-- tools/perf/util/thread.c | 8 ++++++-- tools/perf/util/thread.h | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 2531b373f2cf..b048165b10c1 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -1976,7 +1976,7 @@ static void ip__resolve_ams(struct thread *thread, * Thus, we have to try consecutively until we find a match * or else, the symbol is unknown */ - thread__find_cpumode_addr_location(thread, ip, &al); + thread__find_cpumode_addr_location(thread, ip, /*symbols=3D*/true, &al); =20 ams->addr =3D ip; ams->al_addr =3D al.addr; @@ -2078,7 +2078,7 @@ static int add_callchain_ip(struct thread *thread, al.sym =3D NULL; al.srcline =3D NULL; if (!cpumode) { - thread__find_cpumode_addr_location(thread, ip, &al); + thread__find_cpumode_addr_location(thread, ip, symbols, &al); } else { if (ip >=3D PERF_CONTEXT_MAX) { switch (ip) { @@ -2106,6 +2106,8 @@ static int add_callchain_ip(struct thread *thread, } if (symbols) thread__find_symbol(thread, *cpumode, ip, &al); + else + thread__find_map(thread, *cpumode, ip, &al); } =20 if (al.sym !=3D NULL) { diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index c202b98b36c2..f7df15c28bc3 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c @@ -419,7 +419,7 @@ int thread__fork(struct thread *thread, struct thread *= parent, u64 timestamp, bo } =20 void thread__find_cpumode_addr_location(struct thread *thread, u64 addr, - struct addr_location *al) + bool symbols, struct addr_location *al) { size_t i; const u8 cpumodes[] =3D { @@ -430,7 +430,11 @@ void thread__find_cpumode_addr_location(struct thread = *thread, u64 addr, }; =20 for (i =3D 0; i < ARRAY_SIZE(cpumodes); i++) { - thread__find_symbol(thread, cpumodes[i], addr, al); + if (symbols) + thread__find_symbol(thread, cpumodes[i], addr, al); + else + thread__find_map(thread, cpumodes[i], addr, al); + if (al->map) break; } diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h index 56e08c8ae005..310eaea344bb 100644 --- a/tools/perf/util/thread.h +++ b/tools/perf/util/thread.h @@ -126,7 +126,7 @@ struct symbol *thread__find_symbol_fb(struct thread *th= read, u8 cpumode, u64 addr, struct addr_location *al); =20 void thread__find_cpumode_addr_location(struct thread *thread, u64 addr, - struct addr_location *al); + bool symbols, struct addr_location *al); =20 int thread__memcpy(struct thread *thread, struct machine *machine, void *buf, u64 ip, int len, bool *is64bit); --=20 2.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 60F1F253922 for ; Thu, 29 May 2025 04:40:11 +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=1748493612; cv=none; b=GWrt4nta2ULwZ4rdUQcByBjbuH68Nf5o6Qja0QGLN+ilwtQe/SfqpQYAt7vSz3oVuWYnXafHh5oQ6Dq9k8qL3YsVU9hbVqyIkTBFwTq/IOQ8d+juXb6FmmcxH+uV8gUB4Nb1gZ1ry0g6HdwiD7F58SjNJSlhDedc8eeJ5xEf1uo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493612; c=relaxed/simple; bh=CANFhZkJgyGsnrInmGKjXkCZcjZ3YXzkDfH+xL7C5tk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=r5g+IlAcgbOVSW823fmf+MLe7UYD93DT5O223ksNT51JommDkYuoGj9+xUq+YtWq6x7guF3o8XzXu8rSXhQXFjdoidEwBnSAUYYlCowCoXLenmjQxIJYZX5ThdTE0ad5D/gAnl5zjgGSQkwcDVxUakXgYHPuI69qfPj/18r4sMs= 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=yAmwy0ER; 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="yAmwy0ER" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-310a0668968so484035a91.0 for ; Wed, 28 May 2025 21:40:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493610; x=1749098410; 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=q0+6lU8x18MkCnRglmEGZnHeaHUfbjOQhfXfqkjM75Q=; b=yAmwy0ERJlTDnIK6W7sZ/Ho8PhIICBg9hOHE7ti9zzdopdbbcY+hisQBd3QCrmUz0K xvNltDZoiUDCJrSxNouGuA3u4yhzkLprmbqQKVlwaEtmxEz3QYl6SrIT8BE3JthEhdcR NS7lzuzRgXbv1vLvr9Cv0DvWKe3uHIJGJyl8wdZFunW4Xko/v+tpligiBY5SnYHgZ7a2 FuWqwUzZhaxaQHMhFu/INApPUUv40bHul1qcHoCsJ/Rp8zLoJWp2mjEKLPF8GXKH6a9z 6emzBp+2xmtsXbF0wY3yVBfF6y7jGNvHzdMdRIrqUcMz0rUBtubTDWFkchQq8Bwy3esP D/2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493610; x=1749098410; 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=q0+6lU8x18MkCnRglmEGZnHeaHUfbjOQhfXfqkjM75Q=; b=Y5unRNh3Jgxre6a3XXUs/2Q2qZ92lb0ZiVSxDCJ2yQqg2G5hlrbP7UGcVJQYQ0QdpC 8ryJ3it50+Ln8pKT/31iCa71WBvVjgpgfVG4NUE4p7VtO/IJAfAyrXIUqCgddrU0DzNU yRxwtJn90DTkEab2Sj7WdxEeyid5SJJwJKbvHkEkykrfwa3BOtew7Zjta0fqp6fsslzn VKYvy7sm0KjNl3ZpUg3VD9z1dqn2dGuhg1ukmPXVQNNSTnoTwBjlwqrgPdr2/RPTu/tO VKd4Zci+UzYlJPB56Npu3xQ7NZB8EH7wm6p9Htwcqh/JxEFG+KoAvwBvNoFvyCUHXXtZ jYhg== X-Forwarded-Encrypted: i=1; AJvYcCW93DwzvPuKVr4Fb6MmA02BLr8607rc9G7z6VMCIZE35q02IiaCYVvfTQ/n0OLYG3p4TMBIaRl1rwP9M8k=@vger.kernel.org X-Gm-Message-State: AOJu0YyeBeJXgHmkCDBZuGznx4/RnrX+XunaMZA7iDCnrWnVmLvoIdXt OvXf4ydv9MfUV5pDTsnJvuVjd9IhWIHTsKuXYx+79DcXKCNWekh2Ox0l3vCnjw4tKBlmEQOiFrt V4B9TZorSgQ== X-Google-Smtp-Source: AGHT+IE9ubP4EXyB04CdzN29eN45hiHLXKn9ZXif4h1X/irDCdN/4AOj6erkhGRhVueGltT8T+vgXt9OVBa/ X-Received: from pjuj14.prod.google.com ([2002:a17:90a:d00e:b0:311:4201:4021]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:50:b0:311:e8cc:425d with SMTP id 98e67ed59e1d1-3121dc54006mr1264393a91.10.1748493609979; Wed, 28 May 2025 21:40:09 -0700 (PDT) Date: Wed, 28 May 2025 21:39:38 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-3-irogers@google.com> Subject: [PATCH v4 02/24] 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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 06761254846 for ; Thu, 29 May 2025 04:40:12 +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=1748493614; cv=none; b=EoRJ/o0oGyGqIrmmb00UL+rOKuaGknVZJ3mIYoX/y3tIBO0JIKCEwZYQrE8yKQnmcXPBRahYDcFK4jO1rxlKcgsxHbNQLsBCU6E0CwD8tdycTWxoJVgZ2tutAoBJHXxtNJrvr/LCS+TbwuShnv/i+P4bdlm7zu+2PRVEy44gs2Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493614; c=relaxed/simple; bh=cjf2fdD0rE5LRjT1VfJDou3dEpA6ok2BqEt1s5yCE/o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=EeSH3uWsU+x06neKUEo2yY2OGL3pPtystKW70HM5LH1CzW/575uTWI37R+4FUf0PzyEzC7/ip2FvSjXFPXKHNdBgEKIJdEcUdD4eKLsp9M0G90Y8oxTzd5bPZLMSMcnEwzCPBMAv+xjNi7xjG3AFa8XtqNEyYw4Dsel1aCSmjI8= 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=wogGTUHN; 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="wogGTUHN" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-7394792f83cso390377b3a.3 for ; Wed, 28 May 2025 21:40:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493612; x=1749098412; 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=9aS71aJOPEt1sm6kO8E07x1jFtf8Q1JUjXvJGHfQ3qA=; b=wogGTUHNrDIU+iVL94US5lFwyK4mGKJPQYMB+HQC8ui+QVv+9LpvzqnK7ksHnvWhz7 gxRXD3rRXmaI2vh6XVhk7m9im0103Yzvv5Z6rb+acnChjBi+vd6cCPZ4mqMBOyyb28dL jeZRdX/FirD2KqGtk2fzrcQaCbfwPGEYkn3dA5Bk141uytbQq8VEaeHNDSrtWCxBjFoo k+uS72788HUwV7IFEfgp9qHURLivTxgmXQMExO0aPsFNUzyzXaJ7paYODlqgxJ2T86Ci UGCs2Vgbxc2vFiNMiXgBZcCTABqQEuxr5Phn9SgGlHZT+Zuy1yh5BxY6nTSYzGyfq9S2 PlMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493612; x=1749098412; 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=9aS71aJOPEt1sm6kO8E07x1jFtf8Q1JUjXvJGHfQ3qA=; b=WrOuFnJxIj+cBGqQH8X0Op3btR9P5s01caxKfHuP481wEkPCij75eedAL3KtLOK5p2 7swdB1hiUgen2IhbSI61csEt1cqOjfJm6AJIl9ygcoS51xI8+CwwYoKRbEnobqKr5VDV 1ZOYfJIWq+S6+dOsh1IRyzV1ig6fDMGzQF1sDJ/NUFmeK6WYkewsYODIHiHXDXtTKixe Ld4VifezJaFfu2fvsYiKTBtBlse+oHBTbP1qrPZBRzsGSjH39EwNDR66faO5K9Nxuiaf KvYSpspM28peUteMHMYBIvBZyNDreGt2ZiNZQMBJ3pmd81i4M6XUO6CSTSMeqzOy5SFk Ow3A== X-Forwarded-Encrypted: i=1; AJvYcCWJ6R2bAUTzlpEkLau1vZguew9fGgUi9lWJjMqqs/EQEIi+AoCEELAk77fUiZjdSvAZ2d3dhjd0fc7iMYA=@vger.kernel.org X-Gm-Message-State: AOJu0Yy3L8zB0iYR0EcvTNZzgcoHbXO9H6dw2JO6kEGLuKGvRwUau73x Vag8Dbo6ygVDcDFOcmH22/3eFB0quGGEnkgIlh462ZLlx0P0wDuO3qv1ZVANQPsDFmyUq5ekD+H IIeT3whAdJQ== X-Google-Smtp-Source: AGHT+IFlKCkEqX1XRqJjw3YEn4vn41KmuiPbLqe3e6dAoMnichsXHqoCMaXHDL0e/0IqWUt2otPig48NXi89 X-Received: from pfbik10.prod.google.com ([2002:a05:6a00:8d0a:b0:746:fd4c:1fcf]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4654:b0:736:4e67:d631 with SMTP id d2e1a72fcca58-747b0e79bacmr1311000b3a.23.1748493612073; Wed, 28 May 2025 21:40:12 -0700 (PDT) Date: Wed, 28 May 2025 21:39:39 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-4-irogers@google.com> Subject: [PATCH v4 03/24] 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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B19C2550C7 for ; Thu, 29 May 2025 04:40:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493617; cv=none; b=XGBUaK6/bftaK/qLL+VxJVOqowb45+0X6vyZ8XKZBDnSLV8HUJ6Skp+5GWobnkXgzoyP1IpK7hH9uymjgHgL+fgWB1F500ZIN1sNnGFKN7LRyMyGLkcPZBMi3DL1VagpNq/2384NHOgPWXriSa+yFENw7NnMjMAZrskylzWMOtQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493617; c=relaxed/simple; bh=1ycLWk5fV9lyLWuQyXi3tX0ezpPpYfmFNx+a9R+D2Jw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=lK9b9qUoaYLGdpwltJ+fz2xpy652d7QpQ8PHvABm/r0ejYX3Z68MmQnPMeWbRGJjf+gm3yPq0MsGYUC94bugj3Ej7CErWxH+DSj0eWT2uu716lfynqasCXeAdyWgtZsXoq6mGA4bWnhAgJKu43l/YKBUw61tbJu+cy8PwRMEvOo= 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=eHdL4CZQ; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="eHdL4CZQ" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-23505adcac8so3793855ad.3 for ; Wed, 28 May 2025 21:40:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493615; x=1749098415; 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=zV48/WoYqdzyXjFotpOQe5r1CrvMvRqL5nvLNR8P+Uo=; b=eHdL4CZQkZzy1KRX18Mi8qq3/TFQzq41CkPeL1DGAL+b0ZsM5YVzWKTYQRf8zNY9ld /F6QpWNND/HPK19ENH2zqDgG1bundh4kWN8PJIbNKBUIvI53dG9BJnimxXK1idCBFeNK hVrE5XDIbdox0JtZMLEfsrSZMfo0d3Qgcqh8M9cyLyff6GGRPS/3lZoIS91hslJn2QNJ ntW9lhoVoXNTJn8no4eVrQ1gixoTkfcvcp4CcoB72rKeIAnIVVmuwo4LNHn2OUzpHHSw 5h9czfYpm9tF7h83qqI2KCCmqw/qO8zY99c+zN2/rnTeUqK1ts3N47P4mykFqTktRbDm Fruw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493615; x=1749098415; 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=zV48/WoYqdzyXjFotpOQe5r1CrvMvRqL5nvLNR8P+Uo=; b=ryWUbZJTLmSHbcI4TnZtICEGqe7D7XqkI/zI86aVUbIvH4Qesc16kk4JCNZ53pedqJ SP5y4k4KwN4FVxMR7M1ktQKfu3LoHXF5wD+MEQF7lpaff7FOelyhhyx26qrMmHcxcipb VZpjew+PtGvovLXkVLLAB8eDaIPozayThG8RaD+Kt3WUgNDP6Sv0hT1zkRXKfyOo+HGy eMkPoxTdiSgLhzNOhfYTP5abN/5scbLzr3q6eORcELQTLWuyndqTlYjYw9Vj0gsxmH2d z7947qBoju8a3Fv0zSefMva8huqf2jlAiyVMNUD5D0yzOGeeZOrfWCfI9vwXNVJ7fTaM q6ug== X-Forwarded-Encrypted: i=1; AJvYcCUEs+e71pui2RWhwPUuGl+IbZ0n4b05nSLbQVmkgx9NwthMCtfq3wGEjdptOdyBFi52ai3nqgJTfD6ac5Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzIsWNNC7M0vJD314UK26XtOa4E16uS6akPUAgbD4EnuxReI28W m6ltUkebEnQWsdGA2ZbeJZFOrUYMCqMuZYq/yQuf2EfOposUtdV8vBfgDPG8DYG8XigJgrmA2ir HUSTLv1rSBQ== X-Google-Smtp-Source: AGHT+IHbHv0KBCSKR5RZlG/YUBAiUbnkOCnHiLwEDsNWa9mReoPzdnNAigURx7Ohz8aGzV/i0srg2/onkueF X-Received: from plbp4.prod.google.com ([2002:a17:903:1744:b0:223:225b:3d83]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d2d1:b0:22f:a932:5374 with SMTP id d9443c01a7336-23414fc9852mr338595805ad.48.1748493614475; Wed, 28 May 2025 21:40:14 -0700 (PDT) Date: Wed, 28 May 2025 21:39:40 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-5-irogers@google.com> Subject: [PATCH v4 04/24] 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 80c9ea682413..06b36c7f72f4 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -330,7 +330,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 e3cdc3b7b4ab..38e903307e8e 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 520729e78965..68e92552d954 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 fe801880afea..aa46364f1ab8 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -2145,7 +2145,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 260DF252296 for ; Thu, 29 May 2025 04:40:17 +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=1748493618; cv=none; b=j1PGwBRNBbgNK1X46irR4rQxrbkkJ2yxusksiBvq51OQtDd1C8WchtiC4B64NuZtG2B3FdRgQvUuRZWjWFofaJswOg2EAAcNzQVTHEBg0k7Azv2r61+aD2Ld3Him7beZ2xrlBIWrZPlm6Xbs24H0WLgpz7NvTEXCTb3xZF3uU1k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493618; c=relaxed/simple; bh=8sjuAjOj2orpAYr10kkA5Z/nzFBBjR+5CoUq/1YdQGA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=kL5fnLuTwvuhPoZqK7xPUWqkTJ+zKwfzLHJjR9DRGbRoVQ07UlIni7GHX/nATbpTTy9emxRLh/BNmifbhbR6oD2WBF6ZUPB5Fo9x+dydWq2j488CE32e1nOPU1FEyJ3PQyLMGE3B/WvHvYSe7A1jVRbf764wr7oTMvJtrW/XbaM= 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=hA5dK5me; 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="hA5dK5me" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-231d13ac4d4so7625295ad.3 for ; Wed, 28 May 2025 21:40:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493616; x=1749098416; 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=J3cc4XfHjT63tW0sHOE7oV+T/kyDzOGhrcNlU3mn958=; b=hA5dK5me8MybiChD+cFQ2wvGDS8mnZjvhADjQsPFDtCpGnm+rFIVhgsHb7aDPPnBZr OWfCLdf2dhBDxM87YtYGseGoNNB61ouxMTAon9/QBtMXP3lbKQC/kMWwH+zTRsA3dMij kokdgJeUd3LQuKg+XM3FBWETAgGIx4T/rM0gVk5wv/8EBEcBjEosF4uOHNal7Fj/zVzN 9sfUjsI73zBADvJCE5oqjxYf20rE6Dx6f+2QLQ+mStLxQO4ABZPLTeQCiX7t6i5szeOg JgAk6iFpHzrLe3tMFUdHo4jagXEHoG2e8h98gJmXxMwoFAGy/5uBLDQ953JHrqYCqIgO Np+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493616; x=1749098416; 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=J3cc4XfHjT63tW0sHOE7oV+T/kyDzOGhrcNlU3mn958=; b=vqPQ5/bXBbLYJ5zoE5LbFyfjk7LUTWszICNOQek179E5PjAjZ1zm/U2u7/fQKh8DZE 15v/cWTe7M9KLodE1V7hSaX+c+Rc8rxw6hnQfvcZZaqM+d1EnpFaQSEhhHZQOI+5D+0Z xWL8+DJGThV9m2kNaurct389mbslx3uw7m0ZVkUf0TKYDOwDeYdT/evyBt13/3uoBfxW WRwXmAgiXqnycArB61jrP7dm7aa1IB6zjIVtHZ6fIkXv5LUJHpnS9eCOxmJ2DBkskKe1 /VOuuanHoMwUovCMwTqCsoZHqMsQR1ufSqc9HX1WhfvgFQaJ3X00K5TB7TqB0xIRVPbZ xIPw== X-Forwarded-Encrypted: i=1; AJvYcCXNLE5KcIg+KKW3ev6sz3/+7Vqs29k5YIOZA3P7WgR0e2C+NSXEQvyv0t4BqqqTPpXBNOFLHMo1gmcAvRk=@vger.kernel.org X-Gm-Message-State: AOJu0YxLsBtK1A6xxBtnb3raZ2dhf9P4uUabJql+cOXpR75n5eckkj9Y Ky/o+lo4P6O5f5O9mazKJSCBeI9NS8PX/pS0KO/1WKvC6AsJs2fitY6aiuevWVGyUkJgSbccFgQ rny6fmydv0Q== X-Google-Smtp-Source: AGHT+IH+nZZXQ1e5vfxdxY87E7j36c97TAZI0T6FIGcXkXjpMxDQyv++Eq5U9c3zbazcw0Gy3vnoxfpD0cNc X-Received: from plbp4.prod.google.com ([2002:a17:903:1744:b0:223:225b:3d83]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1311:b0:234:bca7:2921 with SMTP id d9443c01a7336-234bca736d0mr74929435ad.33.1748493616471; Wed, 28 May 2025 21:40:16 -0700 (PDT) Date: Wed, 28 May 2025 21:39:41 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-6-irogers@google.com> Subject: [PATCH v4 05/24] 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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 2025 Received: from mail-oi1-f201.google.com (mail-oi1-f201.google.com [209.85.167.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 7E2D0256C70 for ; Thu, 29 May 2025 04:40:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493622; cv=none; b=K71if5Ew39Kxbg46Kt0RHLqHlFXC/OXtKxkINXUC6Rfz+75LUAWRxqe2T5M3aEKjbYWZXDSy4fceXI/GAjp+FcJ1ZGDX2XlIEIUInnR/+Zb7Pd1Hpm0vW9PBeUIxhwH+s9+OUYmG641mCBYegVAcgWCZ4U39d2ccl+TsQYCEUiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493622; c=relaxed/simple; bh=hrgDm6073NKSgZmuRNrlZjmYOWa6YgnSkn2Bjf0yw1Q=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=ln/wZSf/4jIkuuQryEe76U+0rrBBPEpg1wrMMBbGtC5TWYNBYd/3U9DVs6CYxugUUnxO5iT44SvR0r87NKHuqUB33Jthh1+RKxftpuoEh+Aty4WRhqBYb48taqJPavE6RDq+i3zBYk2EJnp5Dpk1J3wg/MZp29WHBRMHf/oN0Ew= 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=jntMQ+WY; arc=none smtp.client-ip=209.85.167.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="jntMQ+WY" Received: by mail-oi1-f201.google.com with SMTP id 5614622812f47-401c6c3a679so467004b6e.3 for ; Wed, 28 May 2025 21:40:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493618; x=1749098418; 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=G/4nfLMgZpzjPI0//QABIjXhhHcB64OFKqXFaV6Z4bE=; b=jntMQ+WY/GCPbVZjfuuuBlRthumNRhAxTVC9dDsEDmR17S/jhslrtCbY4U0xVYqtSg 3estE5aWVstMBLIABRmBinDJC8agNDPiYA4WbaMRErzAPWjOqGzvn5ko6gZovZLAGaSr lB7sxJ+ay4xY+g1kNxadfj8KmIGdKMspIyXCAyzklYTkkDOAX3dWRLEVfdl4v3tNDwjA pS8dnxZZZNSCSH15l8yw0b64kXRJ7Csal2QdvXUp2TOCfFGlOFdSrTqfCSZeXBLoltM2 lIIL/zyFVSBKPyzucawkw6BVeDtl/GEjASGDIQE7WCxHKR2tD+dTXTESguw3oqOKlHzG 9tYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493618; x=1749098418; 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=G/4nfLMgZpzjPI0//QABIjXhhHcB64OFKqXFaV6Z4bE=; b=TuMqaEDki7K1oMkgpVvI6u/VZBuQpCsKS3JNeOSySzGAzHyLbDPMUyYRwpC8wEgHpB yBm6TRTKszQPIvzFS2TNhtfd6MCykdPZ6y1jgesDvXXIVNx0DiqzOElQG16V0yG2Ygck TvdGaacq3hIh/vP0ThcFy8wTLMOFAXzKn6hVxzfHJdwCbSvbmM5kOT3NUfaCwhkS87We 9VL9QNeXBNb8hqBr1eKkVhYiW8eZJ1CG5POOU8fKQ3mAKlw2q66DnbepNCVDUb9NFsXG r/a8k+vH4nLhPVJGPrVIDG4jt4cygTsjUkrJrb24mtO5waMg8Wi53iWs42KHAGXvbVHj ibsg== X-Forwarded-Encrypted: i=1; AJvYcCWttAw2RQGik4ZIw1lfvZmZ9ELj121bkAn6s6s3MXNTxajLSfw9kPw156Inp7PoypFG7i1dDiV9DT4h/B8=@vger.kernel.org X-Gm-Message-State: AOJu0YygBUYfto7WumC4Q3zvF7msA6OT/cwkfjB3wdUZ4tlHTAHtruwN XC/YuzzzMf99BJWjLixYgewDnZKSKXfIhzYRF8Y4xXZ2YWYUAkxK9uJS4y02ga8OsbxZQTkbiMh lkV2nmK/qRQ== X-Google-Smtp-Source: AGHT+IENFligdelPdiwHRPX0P9XtMn74tYe9bLeP7jO9zz9croZ9oZmT7qzbt5nQGNBRog7N7al92g6G0Oe1 X-Received: from oabut1.prod.google.com ([2002:a05:6870:ad81:b0:2bc:6267:d082]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6808:80b2:b0:400:32b9:7926 with SMTP id 5614622812f47-406468101b9mr10531127b6e.6.1748493618533; Wed, 28 May 2025 21:40:18 -0700 (PDT) Date: Wed, 28 May 2025 21:39:42 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-7-irogers@google.com> Subject: [PATCH v4 06/24] 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 d8da3da01fe6..7fcba821bbe5 100644 --- a/tools/perf/util/symbol-minimal.c +++ b/tools/perf/util/symbol-minimal.c @@ -345,7 +345,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 aa46364f1ab8..dddc02ed8b2f 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1806,7 +1806,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); @@ -1867,6 +1866,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); @@ -2115,7 +2116,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 6E45A256C8D for ; Thu, 29 May 2025 04:40: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=1748493624; cv=none; b=DEcBTE++Fcl4qfJ6/hQAZWEV/FGaz9pklPa9uFQolyPCHUSNjzn+2kiFaUqPTiaKjfvTa4/F2FKkgvaFX9wBxqNSTCiutzKct6hyJiz6NkY423xh//tNFiXsSvZwyahCdSiyeeJIvDjDD3M+I7MeIK/aGU20sEqtiix0f8x5LZg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493624; c=relaxed/simple; bh=Q1uRBMFZYS5F140wA+v8aYFwjrydrw1AvH4/PqfK9G4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=nDhK9v7o9SaYbqw4b/NUkF2qPxyfSkAF0BRgz9p7wZC4DTxsL4dFXUXRGemeY7nU/E7m4DDFEf1QA3r2jjWj1FUOK7QouMhJkp+1LUvPCDAWqof7qQ/kOy/UqupC5heXLiA1nj3hLGq03IqOF+0G61eFOyrJR9+ZtpvcnVSvFSc= 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=akzxj4MY; 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="akzxj4MY" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-740270e168aso431852b3a.1 for ; Wed, 28 May 2025 21:40:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493621; x=1749098421; 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=Nh4f4Q5P2Uu09J3PTG3V/XvH5B9vJjtYVZWZH6R++/0=; b=akzxj4MY+3w1Q+xIKEr3esnZEUWzBg15r0uVh2S5jbU4lTOamBgpTsHKuGBv1BZJiv wYL1QNOrsmOhOyoRWdoqZFz+EaxfdwJ4FGQEqvT1ig4OB2Q9X6HjCnYLKKkTD40ozftF zzly+VBidLBH9ue1abni+6uEx8HKacmuWOavnf2Pc++oRQcoapO9Y38Pla85rPRZWQyW 32dvxKt6O4+Ah+a+w5IBswKjv9gIHaIMXkL/9ccAP7ht26YLoodyp8tGzEp4E5Y9RdKw L4BJAUWL3zz6eJw1hXL5YHb/BOZrYN/ORqfCFPdRqcMpi/zWEGV6X022xvnsQtb5GGXn MFLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493621; x=1749098421; 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=Nh4f4Q5P2Uu09J3PTG3V/XvH5B9vJjtYVZWZH6R++/0=; b=JCR8Zo3zvBUFb7lZZS8BKqLU4PDxmihPUMNSens5yxtkJ8TKq5CUBWg9mTkwaP6SuQ ALbTbgtUCOkZOm0itntZErPb0pp/uTVgM/gtMajhWsd4dVQYrXO0l8U68RRnr3Hhp68V 70+MpJhyX0BQ72GC6wgI1QOoLH66cjSfuJmkMczwlHYw+fiXI8v8l7kTNcwqhyvXCISt rVLCrHJ996LCXx1LKENmVIZF2ZiRJYZmriIGpGY5FEFt3D6CgSQ9aVfYtaMyL4NXodJP cm8bT7nuQ9JWX0Wc0hGrWHtfH11BkxELZYm0rIw7p3IEA2cmA7R6rO1S80/aXD12lNEk Cnxw== X-Forwarded-Encrypted: i=1; AJvYcCUd4YApiuOYNu7lFgfHqn3uoUpXf6K7cbaZLlkjNqrPCCz/PYpHQO+DNb2MUryAqP2ukfmtmFn0b7such8=@vger.kernel.org X-Gm-Message-State: AOJu0Yxy31ZLbL4v1Q2LHmK/obou8hGbWSf9oeTPlA0f9uRCj/Jig9Qd r5rZ8rB7O/xvH5U/DxTuo/2Zll0fLenIHqrxNKixRqAQRop14D1YYJuIN4Jur2/9j+EZnq9nLGq cQKCmyxcAaQ== X-Google-Smtp-Source: AGHT+IGziB7ibXDmgEM1rV5Hwh8omHMrGC8fCcT/zylBJob0QYesPj3EbQjeRgQCUAKGRssdk5nAQP/ierOR X-Received: from pfoi12.prod.google.com ([2002:aa7:87cc:0:b0:73e:665:360]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1893:b0:736:a540:c9ad with SMTP id d2e1a72fcca58-747b0e74e04mr1366323b3a.20.1748493620499; Wed, 28 May 2025 21:40:20 -0700 (PDT) Date: Wed, 28 May 2025 21:39:43 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-8-irogers@google.com> Subject: [PATCH v4 07/24] 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 11e49cafa3af..bdd51fc1685c 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 f0299c7ee025..98b1f73c28da 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -858,17 +858,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 b048165b10c1..04062148a9ec 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -1696,21 +1696,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 || @@ -1722,7 +1722,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; @@ -1736,7 +1736,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) @@ -1794,8 +1794,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; @@ -3157,7 +3157,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 8767C2571C6 for ; Thu, 29 May 2025 04:40:23 +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=1748493625; cv=none; b=ZoYZkLn/SYdZoiNb1TlOkb9iXexZF7X+AAyJEPsIaD3AYJchwDC9JmxW8AeTmvuywb8SNjV/cQrPkR1Pi85pakZrH4fJ35TnvWNf058+JvrwJJGsTpWltW+5DhOHl+9oHbx2yOH5EGpx97bXZpdgnVXHF44XyFYRpu47PSb47R0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493625; c=relaxed/simple; bh=jsmqbC1vJZbprPguR7zwDCDHxB4zTIIrDoxTqEFx1LE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=C560GgjamqMMXbkdLAi1AMjbsZ7aSOBWP83JaPhbcDceZVuOuj6aItIQ1mLSNPVj94dH7rgBD6AAuW+S4rQPdLSItybie527gze/C+u5aeg4bw4YHqEa1/P0+dbhEKhzDJZL1R6poRbLXWFcjyE4/c8r01C77NNuxAw5VTVAfE8= 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=IKZ74dQb; 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="IKZ74dQb" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-747a9ef52a4so605339b3a.2 for ; Wed, 28 May 2025 21:40:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493623; x=1749098423; 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=5JPEQx1UgA1kK0W1Kyi7k61uvOJ0V0RbXR9RGxgMDm8=; b=IKZ74dQbqtQhtAx25lDdHPwJTlggU2wkcLgJclnBJQ0EA3Qa2+RcHIN4Qj3Jf+AzSg 0y0GX14mzJL8qzW8tko9HSCj1r7ZuogfSVf5EZK69MxZp0hnMaU1s4JBjPYzAY68wMmt 5hP0SCAb3bbVTn1msWzfusUa8AX38cuxGj/p59NgplppR2DIHCmx3mc3QQLt/0P1KeYJ Dtn/A6shrzS6ReFS1ZJw+au002BhkRMdEqWdPK/FVVx6IViB90t7ySkhwkOOnX+T2NSL pRnh8NUEZnoIsjhx3sInOlrCnZiSMFHcHfapBi8lBe7Ijj1qyfzMpXBxXEupQJiCxnaj L0Gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493623; x=1749098423; 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=5JPEQx1UgA1kK0W1Kyi7k61uvOJ0V0RbXR9RGxgMDm8=; b=EAyCVcyF3ClIKUWdJ6FZEozcIWQL1uHJqKe/GBGgy1IDLaPZksPboA7GM3QZVpVG3a AsZDu8oDwmKbhRmujrSQMAiqk05lQfdeL0fO8SZqGvfoo5I4zY7AKBd7vdfOSf+O5x3o EMM6bECrggmZGICnlxK+b2ojLZFYgjts1p4RSqurFB47JgT4H4b0t0+PqlHkkOFR+36E rKZZ3ee9kwtad0ycJEZ+/OseAEACqUm4Ev1O+UaTyr3wgv4d3IpSl5akrXzAX7CNuEnK q819v3Zz4GXCdL9yntkycw5ZMZa8QxdCwMjefw2CuK/Hr/pSJTJ5kV8VA2dS9swYRegA 5HYw== X-Forwarded-Encrypted: i=1; AJvYcCWyJ8EcSIYMWQrq07yVrJ671AnNfiQhtDQpU4I3dXectypnQCJs9/BORJdSbDGR8uzRPTtJYVdXoF93R6I=@vger.kernel.org X-Gm-Message-State: AOJu0YwtcKgzTzpB89pa46FA92HeIDOiN+oLuwkD2wrIuHqJQjhz14Oi rzO9rAqdMJGtyT0xe+0TdkQ+mbJUAq5ir8dUG/qECYcdOIN4qNh98C1kmLgCk2giTjQ842iDVQp vHOANnUtUeg== X-Google-Smtp-Source: AGHT+IFW4ud+zMcCHcIRcWhv614Og93PmqbrPfMTEVygcvH8Yldeies4S+HKGdGovs+R0RbQObY2hlDVTQ72 X-Received: from pgbcp3.prod.google.com ([2002:a05:6a02:4003:b0:b2c:4287:b413]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:9984:b0:215:de13:e212 with SMTP id adf61e73a8af0-2188c2406a3mr30902424637.15.1748493622489; Wed, 28 May 2025 21:40:22 -0700 (PDT) Date: Wed, 28 May 2025 21:39:44 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-9-irogers@google.com> Subject: [PATCH v4 08/24] 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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 C98632580F0 for ; Thu, 29 May 2025 04:40:25 +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=1748493627; cv=none; b=lyfHynZO33qniWg4S7N8Qx3rE85QT/0HiFb+3T8WU/W0KTosIhhLqSErIrhHP685uF05D2fJ4MPBUSaQNN5LPj/R3GT7XjbY7rwJcJxoabLxhRU0YmzM8gpGvFEvIcd6bvvPhfpyRNRFqGWc5fQn70a0U7Hjs//6hZlhl1Yqk1o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493627; c=relaxed/simple; bh=FlYGrHzVgLK7iexU49iqr1iQhFuIcnGo6aQmY/tgup0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=jphbNi90p2gpssSSSNPG0yu6bntnXVU8tRnYf/YKPeRTBborMyrQ1jbRQRqvBY2E9Cag6BSxco6IjysM+HWK8VzgkCCTKZA/GZSdFf9TiZpylJ5qkuoBrl6gEv0JxL43tt5ROny3Gak9ky4wDfJx9yQ4JxHXQJpMOz6AZ33ik4E= 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=VBlRnvtC; 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="VBlRnvtC" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-747a9ef52a4so605401b3a.2 for ; Wed, 28 May 2025 21:40:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493625; x=1749098425; 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=YRPcM65B5++XjOtLF59PpukMIedzXTkG3hM8fYdAKms=; b=VBlRnvtCS3VRBaNOuGCuf8LbnCZEYIMIBXDDcC+MS1JE3lwQsIXR8L0OWan9n7MeCS 6l9/7x+1mF0mSfVobRh5H8++XphCC1cQXtigB/ix+KecsjXavqheBCeRIn1LP2FYTKhd wkMrlo+heOosQauSFRqzzWfVQpW087u9kNssumKsCwVMOK8ci50AucfBOR1DAnv+mVsj gnNz8PUWGo7MFCm1Am6NFLH2HTDrdlhwrXBJQHu+x8Efd5c/IUkuW5/QqhXnMDHZSspk NOo+otv7M3cJ/MZibe6pdQ5k6Ox/xCJcZPCgeThZ6hb1VJfp56YbAlSBa0QSxibwjpYK waWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493625; x=1749098425; 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=YRPcM65B5++XjOtLF59PpukMIedzXTkG3hM8fYdAKms=; b=fhjGfCVD56GVnVHd4+MBzbvxmfhZ0ikQgDVDWmUCyrP15lSz0KGhyl/1ZaefsZnYV0 lRvCp/NEno5MO6ZchdYpbayk5lrqdbPcCPieqs3C4q/0rggyIb+2mRXeuYRzw4p2KQJI iczFltHSPOu4PnAFrowNZxyg6J2CDfNWiosdDeMaqWgw8YwJyPjKLg6Cge836lvYdu4L YXNn/Za3wBd0ro9C/GSM3HX/F1KLHu0smN82PVlKJxS+ynAvET3+VebAro/l/erEIYJQ dGWdcU4bGVJPe4Ic0ODYmg4bgkOvqcX8Hefxf3Va/oZJ2Cy9S48BQ9C3lvXCUvkmuUoC bQtQ== X-Forwarded-Encrypted: i=1; AJvYcCUCwEXAG+RZWq12svUkKE2w4xuuMiHxbLTs714X8D26vD2W9h57zVkA0VnQLLcB5LY17IcMX87xYbBrCvk=@vger.kernel.org X-Gm-Message-State: AOJu0YxyhIxqShgtXKllCqrR9xCSY2rj5bvUan22lIFvzJhkCy+aoDl+ 6iH9Va6Eh/QyvYgKkdGMBlgav5Cv1W+IA5JtMhbQoc2G3M5OJCNA16eJ57UBhTHHdMheJzDMlgb XDWtrM4xSjQ== X-Google-Smtp-Source: AGHT+IGE97/4brak2jWWXbsOUIwxxMZsIVSSHJHsfJ1PKZTY+HX2kt+s0A7ggZSXWQhigBEpRQEb7aXdAepl X-Received: from pglr29.prod.google.com ([2002:a63:515d:0:b0:b2c:e7:ee61]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:3953:b0:1f5:790c:94a with SMTP id adf61e73a8af0-2188c28d57amr29649428637.25.1748493624601; Wed, 28 May 2025 21:40:24 -0700 (PDT) Date: Wed, 28 May 2025 21:39:45 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-10-irogers@google.com> Subject: [PATCH v4 09/24] 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 136c0172799a..fe70f55fd172 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; @@ -1810,6 +1811,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 @@ -2994,6 +2996,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; @@ -3400,6 +3404,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 @@ -3567,8 +3572,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, @@ -4098,19 +4103,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 96F7C258CD9 for ; Thu, 29 May 2025 04:40:27 +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=1748493630; cv=none; b=QYOYUE88hJ6QDJ7CyMt2nFEiveSAnoweJYHlhcff0xdTzzWz0C19h8qt3WuY/0mYPH1FmmossnKbQDOBM/tmIN7PVjwAzFdP/N4dpp8OaS/R1BSD3Px66vsof8AZbvH/lULDgKse00I2SgH3IZiYcOjrhFa96LIw1UuphItgyrU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493630; c=relaxed/simple; bh=M5M9ye5F0FJF65FYFrjZ9vt5rb2bEBifYQyamYzaT7Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Za+oGbRvMPh3OVkoKZ+tV9gxdJWamme396tNbZ7kWYAxYx3SlsJYIM5oSZQu9tOYr6AH8Di6Y55aUDWRGyhuvNTW8hUYgKLpCjEO9WtVrnX2X7mVCqUcXBFTjlFU//5AlNgWkIOCknPNyvvH2MVBTuAEnj3lC547+jN+aNqyESs= 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=zuvL9zVy; 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="zuvL9zVy" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b26eec6da92so1243518a12.1 for ; Wed, 28 May 2025 21:40:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493627; x=1749098427; 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=Ut75WEyWq89fAbRvISklTvbsNDy7PpJu27a2wp+U/T4=; b=zuvL9zVyqUM0UDa4JcRytbG5i/RSDJa4VFPwzpknjPyVrD+Q6MXzzj9GbK86TXfwGZ W+nvd6pwgGLlcGX7cuZFvbBgjpCjdCriCBle1VQLBXMFjGNcB0vQNnSgLPDCXnD+Dis5 /L1WJomWTQaMKYd2uDYnTJRecd/xbgATLLMeecBmXYxdEFZ5IkC+Uk2nFICxumHAyc1u TldQIMDsoEB1iJCx7uUb7q2EsROZc3emU3xVbFIifbGxce5hf6wkhFk6P68n+SO2hgTU QAkzonPkE+EzQCM0oclX/ZUiHSwXAR9pTNSe/Of7IWmLjZ+83ohpcf2l2Q9Pu2CKOTkj 6uqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493627; x=1749098427; 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=Ut75WEyWq89fAbRvISklTvbsNDy7PpJu27a2wp+U/T4=; b=TjgYL2vGCGfXY+gwUP+b2SzmdvHw6WSbVsvoXXrGsrtshCZUP9DROMM4oPbD9Z215J v++ZFXArsvYWZCrCnCqQNNDZxgWa2k38T1YwZGFuNECZLNh38WBQS3wJBNoI5jF6oiPQ jUDNHPGR/FuKHhY0SWL0fRjPvtzJ3tOt8VPtcPcwT15T78tNTQaZmtanqNdP9rb6cpop Y+nJAX/i6hvrH4zwHWtKIRu40oqkKSX7jVSg4sV1QA2obVtEnnDBkTmmtvecBdTsDN5R pkUzh7Ny+4OlG/vdTXaIXO+wrqJKRzSOzhOODRYXDVzwRdaap+IjA7KtHmVGbE21zPuM /QLQ== X-Forwarded-Encrypted: i=1; AJvYcCVvcRGbjRU3YJn7z4MxkEB+tztkp7DWJUdnSicFdhjJWqWnS1zxqCjU80qHoE7TT1G8gWjvGZD0X+NPhhA=@vger.kernel.org X-Gm-Message-State: AOJu0YzMxhUiTDpELxDwcWy8Ce8Mx5n84nPZNzQdEJJRxesOlv/poKQZ +4ZdfezFLBOPmg6lIBxx+WS8QRhWINUtZjiS1T0VbtVVC6Wh8yzLkroR5YspEo8XbTuq+b8JO7i yWBTI8hQL4w== X-Google-Smtp-Source: AGHT+IGUJHXSsIZFZSmgdRe1ztb3MySVK7WIr5jrQa2pUDIcQrAFX7VUUDx8N+7XqN568eZkCFY8vCVfoTdF X-Received: from pjbsb16.prod.google.com ([2002:a17:90b:50d0:b0:311:37af:c5d6]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3848:b0:311:be43:f09a with SMTP id 98e67ed59e1d1-31214e6e01dmr2774381a91.9.1748493626616; Wed, 28 May 2025 21:40:26 -0700 (PDT) Date: Wed, 28 May 2025 21:39:46 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-11-irogers@google.com> Subject: [PATCH v4 10/24] 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 bdd51fc1685c..17dd0b906898 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -2607,7 +2607,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 67fd2b006b0b..b3f4797d4342 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 41f6f3d2b779..d525a25fa84e 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 fe70f55fd172..66569ec4410e 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -2194,7 +2194,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; } @@ -2213,15 +2213,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"); @@ -2236,12 +2237,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 @@ -2387,6 +2388,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); @@ -2428,7 +2430,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"); @@ -2462,8 +2464,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)) { @@ -2516,7 +2518,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); @@ -2844,7 +2846,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 98b1f73c28da..49dc86d86b19 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" @@ -547,7 +547,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; } @@ -682,7 +682,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. @@ -1839,7 +1839,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 6c3bf74dd78c..55b7c5ed8245 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -712,7 +712,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; @@ -757,7 +757,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; @@ -3853,6 +3853,7 @@ int cmd_script(int argc, const char **argv) "perf script [] [script-args]", NULL }; + struct perf_env *env; =20 perf_set_singlethreaded(); =20 @@ -4099,6 +4100,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); @@ -4108,17 +4110,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 bf0e5e12d992..be5f1f8204c9 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1694,48 +1694,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) @@ -1794,7 +1794,7 @@ static aggr_get_id_t aggr_mode__get_id_file(enum aggr= _mode aggr_mode) =20 static int perf_stat_init_aggr_mode_file(struct perf_stat *st) { - struct perf_env *env =3D &st->session->header.env; + struct perf_env *env =3D perf_session__env(st->session); aggr_cpu_id_get_t get_id =3D aggr_mode__get_aggr_file(stat_config.aggr_mo= de); bool needs_sort =3D stat_config.aggr_mode !=3D AGGR_NONE; =20 @@ -2115,8 +2115,9 @@ static int process_stat_round_event(struct perf_sessi= on *session, { struct perf_record_stat_round *stat_round =3D &event->stat_round; struct timespec tsh, *ts =3D NULL; - const char **argv =3D session->header.env.cmdline_argv; - int argc =3D session->header.env.nr_cmdline; + struct perf_env *env =3D perf_session__env(session); + const char **argv =3D env->cmdline_argv; + int argc =3D env->nr_cmdline; =20 process_counters(); =20 diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 068d297aaf44..22050c640dfa 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c @@ -1618,7 +1618,7 @@ static int __cmd_timechart(struct timechart *tchart, = const char *output_name) if (IS_ERR(session)) return PTR_ERR(session); =20 - symbol__init(&session->header.env); + symbol__init(perf_session__env(session)); =20 (void)perf_header__process_sections(&session->header, perf_data__fd(session->data), diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 7b6cde87d2af..0427dc027519 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 07eddd5c0baa..dc3a016f302d 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -4749,7 +4749,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 c81444059ad0..c67e3ec938d0 100644 --- a/tools/perf/util/bpf-event.c +++ b/tools/perf/util/bpf-event.c @@ -184,7 +184,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 a320672c264e..d3888b78ed50 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -2554,7 +2554,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) { @@ -2743,3 +2743,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 37bd8ac63b01..903efa107a3c 100644 --- a/tools/perf/util/tool.c +++ b/tools/perf/util/tool.c @@ -17,7 +17,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 25E1F25A2A2 for ; Thu, 29 May 2025 04:40:29 +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=1748493630; cv=none; b=JxGRltD9NeSSkTRjWYFfZCIiJAdZDEe7NCXyWUN44ZUccsEsT0q2/IOs3vJiir3FXFw7k1saQTwSd6OI4NuYFyh6wZd6cKOOcQi6i9gnZMECWumMk/ujboXsw3oinsv4YDzQa7JqjyAXWAQN69D1gXktzbwOEDxjWugD7Roz6pc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493630; c=relaxed/simple; bh=6yHwkKq6IIJbldd/zAUEevYoO7xZpmsIHYFkwvK/JAQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=E61GkHm13zfFcqWVnQkCfqWkZNmSslwe7uJMHV0n1IaURHQ1Xb5G1Um8GQtKCCYZUjlNvvsZLykotpyFkAU9L7VX+yTcuIquvWGl3qeVDr0VbgzxLhLnU1Z8k510RcYrmh8G8/qxttO/20N/W7UlHWd2dqJQSrmoNPCUJn0KKMc= 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=GNCQXbgg; 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="GNCQXbgg" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-311dbea6c10so701463a91.0 for ; Wed, 28 May 2025 21:40:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493629; x=1749098429; 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=ZbWFwE3NBJXfenPf6zVpWFqvg1HOaBHgLfR4kbE7bm4=; b=GNCQXbggoJ87SHq7Rgkv4ApEGKO+GTyDVvvnA42YNd4p9r6iVY0IxcnihyZ+yQkHXq mEQIOFnAeP+qqswB/w1BaxW9v34benJdND6DXpypX7HojagJSeAgLWuIyMM6g2ptTptd LE//uJxHbTahWJI52YujY5OcMcCe6O4nqUk/u2xnc46g3LTH7xixSQiR2oACdO1Jsnrj mS+3jIv8XQCSwoXs1NjOwQwHbhFt08WnnTMZW58NP7PptU5Bfaql6gcqu4ZW1WHE2pOy c+tJJigP87TGOExS0aol/2miz5Is222/pgZzINrTG1nhx8ja9lEQmKIeWUEK5SvKbGri /PCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493629; x=1749098429; 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=ZbWFwE3NBJXfenPf6zVpWFqvg1HOaBHgLfR4kbE7bm4=; b=FDig+G/B49puAOQnw74fqWJyBAsZv5pEScDSlS7miMkg5sIdn6F5+fxw30YKU4H61f F6Gabi4VITu1lwKkzORtU/Nn9JKRxCHkqHyJLGtMWa5OETzl7JjwXOEzeHxcuQ2kJgrZ 8qWEiLIIf8Fh7DqC9rGOG2j0MpvFsGx9zrymQRNA5C+3bU7NRltf9s4O/HcOLsD7OGJ9 T9URZA9ni7oKMx8xsOt15dh88hUcwSxy5PSko+WmVV2zUWzim4cyTIie8Eu1OsjkP/CS dvRVXJd6wxht68dUENi7sl1WbIJ+atwdIfljeG8RayHlh08n4lEkJEdujp++NrPSET3P DxBQ== X-Forwarded-Encrypted: i=1; AJvYcCW456B1r6xj5q2qJRt3pz3uMc7iS0eeOf1GqevsbcAaYeoJaz9UfJMvv8M/0BelcmI+VUDKyUQZWl+8HUY=@vger.kernel.org X-Gm-Message-State: AOJu0Yw4HItLFoJ9hmS4GN+TFvu96c9mpMrOP4oKngxU5EYyZQITYuA3 PlIq+eKjiX4NVREwxFOPwT8HKbdmc3nPeoQHpX5G1oJeDThGSJx6PfkS8GJs4fI32miyuHrpUWd eTVQn7At0+Q== X-Google-Smtp-Source: AGHT+IEMJs2IOOlHldXp9wTZAIVeYOWli7dpE37barkrgzVYs9ce83S04oJICPcjWW3vQ4qCtwTAbu1x11ne X-Received: from pjbph15.prod.google.com ([2002:a17:90b:3bcf:b0:2f9:dc36:b11]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3d87:b0:311:df4b:4b81 with SMTP id 98e67ed59e1d1-3121dc9d6c3mr1350848a91.25.1748493628616; Wed, 28 May 2025 21:40:28 -0700 (PDT) Date: Wed, 28 May 2025 21:39:47 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-12-irogers@google.com> Subject: [PATCH v4 11/24] 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 d3888b78ed50..3af518243daf 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -155,6 +155,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) @@ -2746,5 +2747,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 6FD7225394B for ; Thu, 29 May 2025 04:40:31 +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=1748493633; cv=none; b=Mocy8KJGGTRj3VSCl/Pf5ah2Xdu1gOrlZxnP9i6oTEcNa2uZ8s8xEzbHRQlF2O0cnZol8Xk0jblOwbOvl8AZwQLG+qCyQ/s582bqkbd1/OJYt/JKTmKDFNaJ0J33JSnV/fAoNU7CkrKZgHBBd2H0I0nEJqCA9peiu6XhANjC9Gc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493633; c=relaxed/simple; bh=xMp+usRgUl2WTvqEGVeaWbpus5HOTquKNBudz0dqfQ4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=CdIG8HZzXJQnc2nmggyT04+2RxDnpDVtXMcG6xGlh0HejAyBTjy4rKqXjj2L1qC8sWyxzbDxo8wkAU9IQ9JeIiI/MUFj1oBNAiMHfSuF5MZHrlcb4+a8sY40a3BJ1+DObO5UNNRXLaKQvCHmy+XhbqIMfR5dSXoiRjgFpfpet9I= 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=ZauWW1UM; 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="ZauWW1UM" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-30ea0e890ccso434996a91.2 for ; Wed, 28 May 2025 21:40:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493631; x=1749098431; 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=Swlz7vmmVSy4/2wEo6q6k/iiLMEIBgudazhjYjkBKg4=; b=ZauWW1UMSSeTsWg6ik8XelUI7MxQUfgA4bmawzp3Adrx8V8dlBMfEw6adjxmNRjxtu QmWp9iqGaqpGOEGZwLDVNMT37OwdalRr7aEODoKATY+Mh3/eHRgfn4SObSr4mn4xFg4z pJV7XqwgU0atsvQG2OvxjiZ1FkYsU9ARhAJqtgQmO3d26MWDImmr226LJxfwh7RbN0is 3co6Rj/Zn0bjlNuKBTi5vtKEoax1Aq5iwOCiQKE38v5X1w22mXFK37JKUsAwoD8ZrIjA IbVE0CFK185uc+l9l65Qyyc1LMM/y1a7lAy36b7NBU8eoB6CSRjA153AKEJzHnEsFnI3 UVkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493631; x=1749098431; 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=Swlz7vmmVSy4/2wEo6q6k/iiLMEIBgudazhjYjkBKg4=; b=HrPZD2IcH+rD/8t9iL1qXU11YP8BiD09buvBZY1eSmBh9XliRimOks86anQaNwgftK b0n5CC3Sqsv4W5i28watilDFAuMTnZQ5Nra4oKQBs6QFrOOoCguVtbuRx+X9e0Ikg4EU UQJ+xnOZ5546EOrRjRwWQu+HddhSaQUr2RmQ3OQjI7eRdZFfJ3EIAI755RmWkcRbqAdt 3AsX3GhpCgYeZOLMBTgjKJiTCQedKYhmNPSh7Ef+7Tgbbjeigao3EAuDe4y2quG71xpB a9ZK46+EmzcqHJeH/suh33hv7MWggd7EKx54XUBn1kV4S0iBYqEEm1E67z/vKUFwsq/z goBA== X-Forwarded-Encrypted: i=1; AJvYcCUXhUIE453GyxxQdEBtPI3YHFjmBKJmKdAFeQzYGMlcXvtJ3RCT0LXL7CvwuQV/SI3jSeaoltAB0weCFNI=@vger.kernel.org X-Gm-Message-State: AOJu0YwTcpAHHJM+eHSBi3ZvjJB5sZPas8sv2FyUmDr5Vyl7haE6dMZe K301uA5nzSDc86W7KzUWg+mMjh4Mm22Mq+qAPJNZiVuCTfgmTOPWHMqFr+FIq5t2JmO9yTTYs7O PdiTRopNeqA== X-Google-Smtp-Source: AGHT+IFPOO0nJ1lPvknoRcW8amkM8WXkx6oZuGl5m6c3Xg7v0cVKv2B4LyNorxpTdvJjqoKpcHwARKII3JlT X-Received: from pja14.prod.google.com ([2002:a17:90b:548e:b0:2ef:d283:5089]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3dc3:b0:311:e8cc:424c with SMTP id 98e67ed59e1d1-311e8cc462emr6812218a91.25.1748493630521; Wed, 28 May 2025 21:40:30 -0700 (PDT) Date: Wed, 28 May 2025 21:39:48 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-13-irogers@google.com> Subject: [PATCH v4 12/24] 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 49dc86d86b19..6953c2c8519b 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1271,6 +1271,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 @@ -1283,7 +1285,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 55b7c5ed8245..165668d67a6a 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2533,7 +2533,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 0427dc027519..c63dda6a7017 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) @@ -1820,6 +1819,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 022c9eb39509..ac24b4cb4a91 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 2a9775649cc2..2d36c062e71d 100644 --- a/tools/perf/util/arm-spe.c +++ b/tools/perf/util/arm-spe.c @@ -760,7 +760,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 38e903307e8e..b078abe8e492 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -4228,7 +4228,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 3af518243daf..beb74d9fcc07 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -177,7 +177,7 @@ struct perf_session *__perf_session__new(struct perf_da= ta *data, perf_session__set_comm_exec(session); } =20 - evlist__init_trace_event_sample_raw(session->evlist); + evlist__init_trace_event_sample_raw(session->evlist, &session->header.e= nv); =20 /* Open the directory data. */ if (data->is_dir) { @@ -193,6 +193,8 @@ struct perf_session *__perf_session__new(struct perf_da= ta *data, } else { session->machines.host.env =3D &perf_env; } + if (session->evlist) + session->evlist->session =3D session; =20 session->machines.host.single_address_space =3D perf_env__single_address_space(session->machines.host.env); --=20 2.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 39F5725B694 for ; Thu, 29 May 2025 04:40:33 +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=1748493635; cv=none; b=sww+3ue4a0USXgowmdDuhs7bJL0rDAQmPenUKSAMbMU3MxoMiFj+a4j9C+0X3ubOjkz0pflJFaKEi3d0Zz1Im/lIV0PXbh3k7pKMahAB4t67+yh14UnObfCUa+y1g25+HbfXJxqlATer4S72MWHAAT3Ujbtq2oNcq41kkQyOrMk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493635; c=relaxed/simple; bh=JY2a2d5vFdTqqDzjexlzy3Nj8OgtAMcziLNo0hZmdJ0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=HtIR8lMGMWhlwT9C0/ub4VNd+NZFgvjZyHhkoX9lah4JakI/pAGhqhxDQCfFfv+lx4klJOb0TSKGcMb7X5ktRlXB3QyWObZglnxa6L793enC4QBXiOeipQBrFwbBZpDgvPFn3VC+4DMMBKPpKsVTjI/bdIKuRmbeZ8tZfF5NHL4= 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=Hgp2dQRU; 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="Hgp2dQRU" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-311dbea6c10so701554a91.0 for ; Wed, 28 May 2025 21:40:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493632; x=1749098432; 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=8LK7iDpNNVVXiwLz6xcBPyvta4UJ5eaUxuovNk4JAts=; b=Hgp2dQRUE3auNfsWjzAMraI+kvJAaWDlgI0MhpJ67bTwfidBo3OM2bv5/oHT4tJWeJ 7Wk/xLyYDEj9OxRjlWIZQKhi0PqUAweVWT+dOsUlJBi3XxvuDf8U7PF6CCqe2HHTEHkm UWtyYQLdNQND5pHYzpxJlax2daKYnWdHM2K4Nqm1+xOqxpvcwR6KkXe1QCliJWuIhji9 tHNXhhRILopxi5EztX9HEUjfy8SokEd4iXoQM9cyQgHIiLhLtyV0erqHVcmElrVoRujg upq6EyAfgBjMJxT7U/qAowInONaLKQW8bqP3BcCorArOCQno8yzT7yRg3RV/7fqhce7M Ue+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493632; x=1749098432; 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=8LK7iDpNNVVXiwLz6xcBPyvta4UJ5eaUxuovNk4JAts=; b=FuNDc3dabFubIIKk8ahKMVDJgzT29w9QLd56KbAP+2BjBy/xj7d1eUFRQDuGGA7tYr Ogjj9h3JJl6YO1bltSBvNDRrsMjErFlYQM/t9BnT0z1u7547IVKLCbi9Zu9UDvJ08Grd kWdQMKD86ZbSnJqSQCq+SHJjy/HQnyeUylhZX9HUMspws6hkUy4R4PbQcMaC6ZrRIvlx iUvY7rq2il3s0SO3/ZB4BxHp1wFn/JvpyYcU7oYQuMJWY03Bck47vz2Ex8tBtFBfO3Vv BbD7Ee3zG7yRzVb3M4zLgmd/UrKOAYiP7hgFzjig+9a4Xt0Ao9keMXekiUURlpziFeku qdwg== X-Forwarded-Encrypted: i=1; AJvYcCX8BD4NmMp25kRKqUkU/3w2+/jM75md6EshK0vea13OI7nkbcaKJDn8voTX1duWEuyqfQoYhtsXm8iEPTc=@vger.kernel.org X-Gm-Message-State: AOJu0YxwUNwhbr71qx8vp70lB42d8TZZJaWfzUkJqMmOK9ZDKlAu6Gao m+b3xO79r+IN0/W8RFewp9ObevSy4vl7+iwEC8UUPakKWLu9V3+iFVD8L2GLZx4BRUYfZ0HhQ1I wikWvt3sLag== X-Google-Smtp-Source: AGHT+IFiVUEgqDm22MHTvJ1Dg53rZerkDm4fxHMhqC8mmFJSMu6m1dbh9+wdRefdElVRgB2MYP+yLZCBMZy2 X-Received: from pjf8.prod.google.com ([2002:a17:90b:3f08:b0:311:e9bb:f8d4]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:e710:b0:311:c1ec:7d05 with SMTP id 98e67ed59e1d1-3121dcc7360mr1188641a91.35.1748493632569; Wed, 28 May 2025 21:40:32 -0700 (PDT) Date: Wed, 28 May 2025 21:39:49 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-14-irogers@google.com> Subject: [PATCH v4 13/24] 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 | 178 ++++++++++++++++++++++----------------- 1 file changed, 100 insertions(+), 78 deletions(-) diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index b078abe8e492..830a622723b3 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,19 +2564,19 @@ 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; bool do_core_id_test =3D true; =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; @@ -2584,12 +2592,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++) { @@ -2603,14 +2611,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 @@ -2619,15 +2627,15 @@ static int process_cpu_topology(struct feat_fd *ff,= void *data __maybe_unused) * This depends on the configuration. * AArch64 is the same. */ - if (ph->env.arch && (!strncmp(ph->env.arch, "s390", 4) - || !strncmp(ph->env.arch, "aarch64", 7))) + if (env->arch && (!strncmp(env->arch, "s390", 4) + || !strncmp(env->arch, "aarch64", 7))) do_core_id_test =3D false; =20 for (i =3D 0; i < (u32)cpu_nr; i++) { 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)) @@ -2639,7 +2647,7 @@ static int process_cpu_topology(struct feat_fd *ff, v= oid *data __maybe_unused) goto free_cpu; } =20 - ph->env.cpu[i].socket_id =3D nr; + env->cpu[i].socket_id =3D nr; size +=3D sizeof(u32); } =20 @@ -2653,7 +2661,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++) { @@ -2667,13 +2675,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; @@ -2682,12 +2690,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; @@ -2722,8 +2731,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: @@ -2733,6 +2742,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; @@ -2746,7 +2756,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 @@ -2765,14 +2775,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: @@ -2782,6 +2792,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; @@ -2795,7 +2806,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; @@ -2879,6 +2890,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 @@ -2919,8 +2931,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++) { @@ -2956,6 +2968,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; @@ -2994,9 +3007,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: @@ -3008,7 +3021,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; @@ -3017,6 +3032,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 @@ -3031,26 +3047,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 @@ -3074,8 +3091,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: @@ -3227,19 +3244,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; @@ -3311,19 +3330,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; @@ -3361,8 +3382,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: @@ -3660,6 +3681,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 2025 Received: from mail-io1-f73.google.com (mail-io1-f73.google.com [209.85.166.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 09021254874 for ; Thu, 29 May 2025 04:40:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493647; cv=none; b=PbvRz3wTDZ2yc7X9o8W1aZCLeRPDx16CLOUP4WJQdoofBaLFw92+IchhUeSV0q+tZDztjg7bkK67aP6z5XU1hTZSiMfOOKV8pAXoN27VJrJgcZahNXr9pjkLuRVJOFIS1xRu3Is11vLI6hP8Xo1N8Z2VzMhhYrKfJCbM8d66/lI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493647; c=relaxed/simple; bh=NhBnndhX4LB3FdD/5uU6ADp0ctkOaFvPvX0vjbVMVao=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=M7YRjmFvYNYUEuyt+WScNsTAZhIwNq+XPXIyx/egaCZsvHjXJ0eSHS9YP3M4imyzWG3KvhgNcb5JwcC+t9RJFbIR5LeHrRupC/yE2TVFONoUFfVYC/VgberXBEUnYgaZS+CORqDSzizjGvHm2DBF2FQ8kB/PxjmFv+aqJTGc+/M= 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=SwUjkLUO; arc=none smtp.client-ip=209.85.166.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="SwUjkLUO" Received: by mail-io1-f73.google.com with SMTP id ca18e2360f4ac-8610d7ec4d3so62467939f.0 for ; Wed, 28 May 2025 21:40:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493645; x=1749098445; 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=TTFefAgt9Bv9s2Cr7lm07Jxj+8FhXrOqCFlDv/Ji6B0=; b=SwUjkLUOBM1wQcHJj5trvG6hoRoRgIencmPZdclCncxXQfo8CD9poGUt3fgsoYOvBd 9q4BxEju8RmC6Q3ysFvEVedYjr/eg4f0knDdLRHrPalzZTjccI9dYwjAp5lT/UQTIMJh W6ZfOIoZNQtnuOLBKUFcZKwrUTwL6s0aySvHWnLFWOK/1MjtypnWeUl8Rvdm5xSDRMaR 3+GbI/0yf2c4sAHOMG6yKvdF1la6JBxFyb3c4JyEGF4aIxjpDF3xjoSSfQV9nVkV1+tM yjNaU4EJN+eWLjvpVdffJb+mZlndm9pGOXggrlurBfm1NY47ZdiWM0hAEc42r/5B65P4 ZmTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493645; x=1749098445; 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=TTFefAgt9Bv9s2Cr7lm07Jxj+8FhXrOqCFlDv/Ji6B0=; b=FOiv6dkG59X95nBeZH4ZIwJYlMKqEkma2brYm/JkB1YSI9KH+oCHjBEX4VnkxpzYmC OMvv2Hhm6FDX1CGpxPSQ19oS4ziwBNzYSWV1HvUlkcujoqJhpxCAE9xjXwk3CZT1zNuY lyuVaidrA2XfY1eaSWBdVIeUnO08fRDxn8glARxYAKOQ52u6+HEheXQ6iC4MMtICkfIE CL9hSXOK8t5xhG2GApVgHhrli7aGLWsjOnW7CzfbFzDGeRAHiLU3G6f3F432ED+fiTfb jIcQ3+wBFjoaQDQVDtExkONh0PVN37qhXgyU44A9tlhMhPGLB//S5EOyq4ofhuBzfhZN r+nA== X-Forwarded-Encrypted: i=1; AJvYcCWfw39G6So8ujTY/lBJzUU075V4sZeD3eVlyq5NYCOLsLdmwSx3rBX17KQ7UrJJwauqTab/aUmNQegpX0o=@vger.kernel.org X-Gm-Message-State: AOJu0YyP12UE5kdhABhB5ECDbaeKNXNeFg5zq9k781IwmLn7ytlySueE 9o5S8OlXWzvYOOT8lIfBrWr/tEvm/1c0oI4FA6DtsuMa3dcTj9zIf/dZzYtrnHayPoMwCb+3yZl R8MJ97b8trg== X-Google-Smtp-Source: AGHT+IGqGjVVd1/AU5tRIDnawLBLmOW4y1o6ndEZIT+0P2/Zh+/TYbYaHsUFRdKXyFoVVQail0QCj/KDDLmJ X-Received: from pjbdb8.prod.google.com ([2002:a17:90a:d648:b0:311:9b25:8e87]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2ec3:b0:311:d258:3470 with SMTP id 98e67ed59e1d1-311d2583572mr9642907a91.13.1748493634483; Wed, 28 May 2025 21:40:34 -0700 (PDT) Date: Wed, 28 May 2025 21:39:50 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-15-irogers@google.com> Subject: [PATCH v4 14/24] 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 36411749e007..b363c933e782 100644 --- a/tools/perf/util/env.c +++ b/tools/perf/util/env.c @@ -254,6 +254,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 2025 Received: from mail-oa1-f74.google.com (mail-oa1-f74.google.com [209.85.160.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 6AE2725C836 for ; Thu, 29 May 2025 04:40:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493640; cv=none; b=eLw5qQWwszC5zPzPUBfpmztr3NQZQodVM7o4TbTtLNJPJ3RvZDOP5S1Rgy2O/Jdl+bH4L1b5/OSB3lPJMCdPEYpj2sUk/9N95AcR3XJ7G4FSXTSyEesZfSwNmQzMJWFuW2MY06/1ZXcz3xVtE9EF21PlOKPWoeYLCu7BCGXh5OU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493640; c=relaxed/simple; bh=fbeOTQRo2s34TVovUNwqxb5YEAi96HQ+lyPHyELiZPg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=FdQcy/3pY7Z7greW3Yj2j+hne6C+1otnJcJNB+cRwBzW6MDh4E9i2K5cuwyDYN7B42FQgH44Nqnr/xvqYJ3CnRNvhlBg3l/vclnb2jMBdc7kv4wiieN/59nSSLjuzL1d4B9VZZeB/9glGS/u1NXehSJ85VdmJfIB6loAVRVUPLY= 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=igIeWODo; arc=none smtp.client-ip=209.85.160.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="igIeWODo" Received: by mail-oa1-f74.google.com with SMTP id 586e51a60fabf-2d5723630a2so929807fac.2 for ; Wed, 28 May 2025 21:40:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493636; x=1749098436; 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=ksP3WPbUsU4bQu6Iqr1vG6L+3oh4iwZGBG8EolKM1j8=; b=igIeWODoDR8mPjmH37Qk/IDO5fArT175dbwlaw9TH1Wv43AXsqZ4bcLp9L9k8RqYSI Q4HMtkHjlETwKMrIFZUa7ALdwqW702pYBM3bnlhbnxep2Tq9fibW25EXZ+y9MNeeYAQA BK31x4vpfWLdyrkR/4i9m89sPXyQtgnTskJtIswBv1l5/+G4ciimYl5AituCj8lAFm0c S+KmiKjbYCPZh46RDveL0zJzsKdYu/q7tbW1dyRL7KtkKiAM0skGFK29K+Xjh/8lrOss PBWSJ6LsLni3IltvvfJ58J0ICCEErFoWmm3WbOcAUsFbm+2Gp4xc0tDgER+2f3O6s8vR VtFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493636; x=1749098436; 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=ksP3WPbUsU4bQu6Iqr1vG6L+3oh4iwZGBG8EolKM1j8=; b=Xanq5HtlWAo7CMJ1XHSAyqWsAVfxeeGzZZBT7BLFm3IDTGxnk98YrG9PuWRXt3wZ92 N5tq5CW1YHNDOWZKGiGpsvNJrveCZeC7iIY2SfFm+O1JK1ypjNKBAgjBijbn1NLwFYsA tO5rOzj9lHhJbql88FuR9fKUSB5dSSaynRJ5ZUYAxbXbf7fO2RmNzu+Ug0S2zCujqeK7 rNG+JAJvRAKC2/LBPfTiwwEoytGosBgLNDr2EEvDK37B5stSF+2K8Ko0yYOsKIONONHa dfiVDwx33kKdbZNwbZjN7fDeeHYWniQhSJLkXUD7M90O371j5LyGpl8tRS7Cqm4zpECg EKgg== X-Forwarded-Encrypted: i=1; AJvYcCWPSMWzSK0HFe02AXjaJrmkOUmjQqsfbuBmMw64YqAVddcDPF7csGWh2WRCi5+E/z+Cyx/hJoIQCIStGEU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw7WI+7ecd9OPmxyM8d9fICIjndEpgn84Xi47RmoXTBItiNRWMF g/xwU2AyZ9uIe4zNfK69jlkPBdDJXravjOA7xqxdXa+/m9t+zGC5L4IamthesxEolKGwA6mG0uB qEXZI8aDisQ== X-Google-Smtp-Source: AGHT+IEqotw9o37/UvpgQTeU0n7IlRVg35AZTMDidm5AqoyD+noNIYgjoLwtSGrirElwgVnuXlF3IvZQ2SJz X-Received: from oabxd1.prod.google.com ([2002:a05:6870:ce41:b0:2bc:675d:7cf]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6870:4f85:b0:2cc:3e39:7352 with SMTP id 586e51a60fabf-2e861eae439mr10073887fac.18.1748493636334; Wed, 28 May 2025 21:40:36 -0700 (PDT) Date: Wed, 28 May 2025 21:39:51 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-16-irogers@google.com> Subject: [PATCH v4 15/24] 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 17dd0b906898..af065f1b8ed6 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -2538,7 +2538,8 @@ int cmd_inject(int argc, const char **argv) inject.tool.auxtrace =3D perf_event__repipe_auxtrace; 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 beb74d9fcc07..9b477cc73c85 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -137,7 +137,8 @@ static int ordered_events__deliver_event(struct ordered= _events *oe, =20 struct perf_session *__perf_session__new(struct perf_data *data, struct perf_tool *tool, - bool trace_event_repipe) + bool trace_event_repipe, + struct perf_env *host_env) { int ret =3D -ENOMEM; struct perf_session *session =3D zalloc(sizeof(*session)); @@ -191,7 +192,7 @@ struct perf_session *__perf_session__new(struct perf_da= ta *data, symbol_conf.kallsyms_name =3D perf_data__kallsyms_name(data); } } else { - session->machines.host.env =3D &perf_env; + session->machines.host.env =3D host_env ?: &perf_env; } if (session->evlist) session->evlist->session =3D session; diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 5B68025CC51 for ; Thu, 29 May 2025 04:40:39 +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=1748493641; cv=none; b=bqcTOfJAI1dJIqpxwvGI6hsfpA9UelMnqa0sqxFlT4W+bu++nRj9Oe8oEZaRtFDNcB7YB5K3CgdCfGQfMZZCUFynzguTRlB4grmptqvoM196Mi3RDzqLb4vBdgGL7n7Fzye5Het9L+N3RB5lVQCp75lmrJFWVEC4kC1JvMfq1Bk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493641; c=relaxed/simple; bh=njJn7n/5kLIH9BxF+z3EOdBKR9OtD/CADSM783LEAuo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=MjHDHWfvSFEOgsPHIxePoAVuIersXnIEOovCCPqkD7AMcIzE10BtS0LLgnZ7odgFUazy18lsoeJ4fE2TrwHpi00woifXV9JgbdDfh0IVDJ3XXHOCeuadw5zZaJp1ILDlfELgXI8ckW9XiRp6+cAKsiL8EV8Wpxw9LEgNCVkAWwI= 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=l5aen7h0; 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="l5aen7h0" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2344f94f9e5so3941105ad.2 for ; Wed, 28 May 2025 21:40:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493639; x=1749098439; 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=5pnm6XAU4xFoMWfTd8OLWEtaFTFv8v2LBbG5v3SrDeM=; b=l5aen7h0dDCbQTPEgFvVcu97it+t3umysoF33P/qi+iuzqRgoaiJeLtHSyrsB+QjpG Dk3dhyn8cw9W+GG7oqhkP2HzIdw4SJgwQljzspRmqtQiA28rGHRLVwsy570i7ZfbAJ1p 8+bK/RcgINuKGO7d98ECl6Rv9C5Z83GsvGGP9FJB7Q5tQtJUWutc3+8khPGINwn1Slzn D0OOauCTM/EUdmjbo9PGw2NLzMfi2fzvk6odX5Cn3n65j622FtqH+AMfBSjgL9kDk1Sr LH/StmobectX8Zmx6O7oZJE6pP4ZjQt2u2Bx7sPdHvC5OleDvW8QzbiEXjdYzWzhdn+R 2xCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493639; x=1749098439; 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=5pnm6XAU4xFoMWfTd8OLWEtaFTFv8v2LBbG5v3SrDeM=; b=w8pL9/N+DCbuJ2icdLsJ8+fHBp70r5I6wiL7N7TW61rG3vMkxabAiaaKaqDBf4+3A3 2fQbnVfNwFAleSiF5CQ3Z6zFF3olHx8AL4zcwyCisjH/ttMj8dWsQ65YrUFdT69lwkzX EFclGBlHreE9NRk6hjigfeLycOt2xanJQTNAINLcvmBHQF6NhDTxI4tgfzE8wY8OHmBu KUaRkPl7a4fTXnhWd+zlCbwE+EZvN7yRxuxnG/bLpUC3ugR6y1RfkRFhSLSXAbcWyhOE vj0d/GsIvrOBYsfTB6WGnzZN1o5pfsVoMjtV4kYfS0wsPmXxz5xqAxG5vCccMVKj4ZSd cSpw== X-Forwarded-Encrypted: i=1; AJvYcCWB62ehX8EtKXMXNAp/S5PB202rBeTyybQT5FHABAdyXVqhaai7nM5JXL3oqUFWCRjHu2ZjlSd3A5ayNmw=@vger.kernel.org X-Gm-Message-State: AOJu0YzVfwq0GPfy3Momt2kRz3XMi9vP9SKjT6+OCD25tM5gEvWqH0Gx e7EjP4T/d8nnm5HkNnl2nrYB/fFc0+rXOYrahLY7Cxno+2JGfnL4i6xjZBhQlU1gOBSHkYyOiBf XtjWbndrPXw== X-Google-Smtp-Source: AGHT+IEUdCPJiJpyqBaz6iiXCBXVzYTDWVBJoUhGLiGCMAHw7VkL+HZG9N9o2zdQKDxspEDQx15JDhYjLuti X-Received: from plwg3.prod.google.com ([2002:a17:902:f743:b0:235:6d5:688b]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f611:b0:231:d7f9:dc6d with SMTP id d9443c01a7336-23414e9b517mr308516605ad.0.1748493638649; Wed, 28 May 2025 21:40:38 -0700 (PDT) Date: Wed, 28 May 2025 21:39:52 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-17-irogers@google.com> Subject: [PATCH v4 16/24] 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 c63dda6a7017..2327496296be 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(); @@ -1819,14 +1831,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; @@ -1841,7 +1855,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; @@ -1863,6 +1877,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 9B5C9254854 for ; Thu, 29 May 2025 04:40:41 +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=1748493643; cv=none; b=T5+1FaiFEvx10+2bo8TlfeM6yrpiy5QjbHG6zogfuCTx1D6hMFci16wkJ/r16hGXA2D0uvoBR30xs02np/YJ192cfQOWuRBrflcK4nVa/X35JnicrDd74XZjwZErnH7rGHoo4yjwMbsnITxFBN2hZ2OMuBYM9+575CPc/9IAgYs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493643; c=relaxed/simple; bh=tEPX+uZGCPtnbdtF9xb+Mc0WUL2DtIJaOpBwsvvjGGQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Z5aAl+JtD0dT6iAZHEjtwggy/V+O40QAqI6FxWOiigMsE0Xds67j+4h9hYrm0FskaizHKuGn+FfUBTkEOzvHMaRCBpvbg7yhvNKThpYT4tPs8k0zUns0lySastpR1AyyqwBB6h6zECXeuuVz3zMVLDwpEUAKPfFwjG/tE+ygzUE= 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=jh8sec3j; 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="jh8sec3j" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-742a969a4d0so421297b3a.2 for ; Wed, 28 May 2025 21:40:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493641; x=1749098441; 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=PHcAoKcEAz6NjioNuyJCAtZJ04gYQ2Vd9rn/ckUmB94=; b=jh8sec3j3SgYgX6yw3bbcU2CZ32SuTF3IO0PMnz6ZbxcJwl1oLumkHoFoZ2unVx9u3 qJyBvR3tPpTLfnoAR4rudexg4Sc61NMNuqfHmV9rTajqLDP2mHnGRyUYSobKPdEsHzcy C6EnfnfjcYNhipY9cUSz2DcgItol1LMWqMMEdxbZdPEe0bD6vVZVxS5eMi00JwwZkvv1 V+xNzSN6x8Y5FqyBOHkeVFxxV7A8/EJtIFlzICtAXCF52CG2Nkl0ybXK9x4tuRDM2kIL X+yqytjrDYCShmIw5Xh3bv4CWJufqYRCoeib8qB2RlnhXNHfIuy0x5gpbtKQHyCQiqdk gqZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493641; x=1749098441; 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=PHcAoKcEAz6NjioNuyJCAtZJ04gYQ2Vd9rn/ckUmB94=; b=a0wO14viNSdCe7rDAFU/59TclK/aGqRr5u8U7JgQL3cUezUHibGLrldWv0OGW2P6/p p88xP2QTDvIe97BVP6GPJj1HjWubzZmZe4kFT8IwTfW5oE9eHzA4iKS11tIbTc2tja7Q X2CGJJpUL+tnURoKYZEJwygUY2CcBoJtpo4hgTTx7b6+WsGRjHzOtxGAYM5R2NWC+DK4 cdBMfnDPb/brtf1fj4j25l7Z13U5bq1fZqAEAWHlvkzfueSaSh6bNa8EOtC6J4An5PT5 nDOGS2fNgq+JlsP7a2SBK+b4zkyqqMQ+JMXaNcRKk4IqrIR4OiG4CwvSmlOc+i8ye0Xj Nmhg== X-Forwarded-Encrypted: i=1; AJvYcCUhTUcnju32IfVO8Tz1IiDUGtTXKVYtzX4oQMOiH3CPUw/PmlIEFOk4vG+G1sYgbFtxb6VHkpPOYaxgxJo=@vger.kernel.org X-Gm-Message-State: AOJu0Yzep1iC2HH5gEojc4QvSkVemtTZl0G9VFWa6mWcUYxm5oHO+2cO FpqjMIfXWSSnGejoffUBCbKL2FfmKzfmlsY5EKFqqkfvir0FDYUE+KdflDFOaNXoYon4Zp8wyKV gu42NJlX93w== X-Google-Smtp-Source: AGHT+IHsVej8VGf59PVoV/WsAbQv48c+JHrK5n0nxvTWAbXE+gZjkEjQI9js0iwRPBSyxm6B0zMWcwEzk/jC X-Received: from pfbbd35.prod.google.com ([2002:a05:6a00:27a3:b0:737:30c9:fe46]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3e13:b0:742:a77b:8c4 with SMTP id d2e1a72fcca58-745fde79251mr29384777b3a.3.1748493640647; Wed, 28 May 2025 21:40:40 -0700 (PDT) Date: Wed, 28 May 2025 21:39:53 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-18-irogers@google.com> Subject: [PATCH v4 17/24] 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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 A716825485A for ; Thu, 29 May 2025 04:40:43 +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=1748493646; cv=none; b=qUnys9iIVKIUR0Re0+c1HsYfuKdcwj8xMpI55R3zkTt2ErrjzQcVC0ATPhtdwUXyvV1I8OiHJHdD1P200u7MwquLc3Kno+8cRB7GfgULncfGRitirvvO3E6/YA5IED9iNY5kuDxkHhsvam+xmYZiUvXmkXPVqRidqDaylxVoPsU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493646; c=relaxed/simple; bh=Ep/Fp0vDgaxUqq9eMuM3Wsrz2NnNpWEP85MA235QWHs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=ABsUDxjk3F/r4qJh6mVF80i9pnjINMXAyyOsp3yuMXbvRWOFUx+auoWlEgfP0ChyDgBpxG99iLYJaSbJznV9VZJbBvGyRTGfApr50KdJ2uFwd0MSyTvjD7pZX5YttkNvfyPYnJ6Lz09Kwfe5vjqPKw50IqpxY/Qmvu5hhjBJFc0= 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=hzEzpCJW; 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="hzEzpCJW" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b1442e039eeso380261a12.0 for ; Wed, 28 May 2025 21:40:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493643; x=1749098443; 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=UGVGmKJNvasoTYrhOBy2oajxfqrLWwjVEzeBncIdfQ8=; b=hzEzpCJWvpyFnmVQzOpxu2FTs4yNeW0yxWGQzMGQWAqqvRCUeH9FKcDhOqw6nEer4P H5prjc7qMoipfAaAAwOWxRTGE7NtUVq86MOX815rIfODR4uM1YWCv11siIg/zZdWNAHF fkwE3kCjX6fSW7HI3Pn185sZBzZbut/d5FVmIlAy8qeLHBkFqPmR8C6AYxi3hzxJ+7jC XEWP1xZxfI6m6Y7QakvI9sbdeDuF+ubkDCDvh4eFPKUeu6y/SKbB/cBhcYta2FvekBuR qrtG6dmPtUpCRRWEN7UenXgTrQNsf4WLg47zsldoGrn9rkocL8avxSdgAT70QAkZx3A6 1+mQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493643; x=1749098443; 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=UGVGmKJNvasoTYrhOBy2oajxfqrLWwjVEzeBncIdfQ8=; b=HFn4rOlDP1x354tpcTdtYg1j6v+ABpuvml0+QG4UxpvRkyKCK4pc+zx/sku1IrzN1p hDu5/YrHqrmGM71wkPajMhDOqxbIKIUmhA/0Mt4iFLAzmXU+JQf9ufHkjGVFDDh9ovOM xFQm8/yKMgxz9bBy4Ijt5IDjwnC2tom5bxUO4xQ/Xcrrqf2B5Ot1JGj3NmeCwq2A3OUO Ebi9eQanSyZ0yA1TEJROYFODSb17n1Bxj6gjM+5YVNjxwba3pCU1HgKmQ+4h5kvjRk1f n7c7eDxqGOcrzu+fG4DrXKlELN+RiHvV8WqQaPIuuXcU+swCN8uXV+1m3pnuRLKLv4ZD UpJA== X-Forwarded-Encrypted: i=1; AJvYcCU0tPMeq4/P79MvISaVpcsKFWXpglkK7StnIfbenLHCbdase2U2K6mx43shmUSNRgrxG4d5fqUd8Luvi7c=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5cWBMkDod5VSMbL7Fb/13U3ijg8Tpuj9qA1bLnzsCavk7T2tR pOYgT6SYTVUYLiKxXevuhW/l5bK2l5GwQIVNWw0CL2rT4fkf+DwarYDnJPzHHpK1HBf1z7hwuhE x/7+96H9WLg== X-Google-Smtp-Source: AGHT+IG2i7dBHliCjjVub5IEicWGVAH0xz6vzwi8Hb45u7BNhwsmG5KJAVfLIs+kRwPoowWgbUGs/WUFumxf X-Received: from pgbcp3.prod.google.com ([2002:a05:6a02:4003:b0:b2c:4287:b413]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:9d94:b0:1f5:80a3:b003 with SMTP id adf61e73a8af0-2188c3b2ff1mr30061584637.37.1748493642711; Wed, 28 May 2025 21:40:42 -0700 (PDT) Date: Wed, 28 May 2025 21:39:54 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-19-irogers@google.com> Subject: [PATCH v4 18/24] 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/machine.c | 8 ++++---- tools/perf/util/machine.h | 4 ++-- tools/perf/util/probe-event.c | 5 ++++- 11 files changed, 68 insertions(+), 29 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 dc3a016f302d..af1cb6a5ba1c 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. */ @@ -1980,17 +1981,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); @@ -2001,9 +2009,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 @@ -2012,6 +2021,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 @@ -4453,7 +4463,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 4803ab2d97ba..5f98e29e21fd 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" @@ -199,19 +200,21 @@ 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; =20 - machine =3D machine__new_host(); + perf_env__init(&host_env); + machine =3D machine__new_host(&host_env); 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 callchain_param.record_mode =3D CALLCHAIN_DWARF; @@ -236,6 +239,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/machine.c b/tools/perf/util/machine.c index 04062148a9ec..7cb3d2bfc180 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -128,7 +128,7 @@ int machine__init(struct machine *machine, const char *= root_dir, pid_t pid) return 0; } =20 -struct machine *machine__new_host(void) +struct machine *machine__new_host(struct perf_env *host_env) { struct machine *machine =3D malloc(sizeof(*machine)); =20 @@ -138,7 +138,7 @@ struct machine *machine__new_host(void) if (machine__create_kernel_maps(machine) < 0) goto out_delete; =20 - machine->env =3D &perf_env; + machine->env =3D host_env; } =20 return machine; @@ -147,9 +147,9 @@ struct machine *machine__new_host(void) return NULL; } =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 b56abec84fed..02641c1074db 100644 --- a/tools/perf/util/machine.h +++ b/tools/perf/util/machine.h @@ -169,8 +169,8 @@ 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_host(struct perf_env *host_env); +struct machine *machine__new_kallsyms(struct perf_env *host_env); 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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 A011E25D8FD for ; Thu, 29 May 2025 04:40:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493647; cv=none; b=bvF8SqNNXJ5kxyhNStW539iI3jVS1+VOjWwpopJ4VRsC8VWQt5XiOx175AkhehuJ4xsfY160pPVe5+ynEI22y3A5YmGOyN/gDZGxnvs4f91kk35ju+6QepDFX/g5uT6iJE1cerHFF32jeI5nGcyUkdcuqWB3rBMpJqz28xDxti4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493647; c=relaxed/simple; bh=YHbWm2yxj1fAwq/L5g4cTe2YSWi0PRNEpHuUS9EzDy0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Ov9K9Ttta91YYXMSP0630BTmg5zbpDQuQhOB/ciYw8SKPtSy0vAFiNdWrS1CYmTIVM3XHtRPAssoJxS5VvAdGqkXJGqOm9lZrX2UHPky0q9z4aiTqWlJm3ienNpJFudTv6jXvXIFUCjRueP0mJfG9k+l3UJVO8FB+QiXxjkylSc= 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=F1E0KUuy; 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="F1E0KUuy" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-3110ee88316so505908a91.1 for ; Wed, 28 May 2025 21:40:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493645; x=1749098445; 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=2BpKlJL8pzkzbqgm7fgbbElRoUwnyGMPhhJWvEjPnCw=; b=F1E0KUuyLnV4PPyfVYa9hk3mSMRh1oVqIS+rTL87QJwynzaXbrQnCzYgpzU3EwnrNe MUYP3IxA8Mi8TNXnWz/1YlKQN7cjsaUev/JXEMRyj45ywqy/PA7EJLQGjWIuqGxnhyQ7 vrzgdoxBjLXEvuFFBzHKXK9/nTEBlD+YVrzNZI//PTbFBVn+x3gGPMGnatkXw2wSBqOt HKKC2jYk4bXCs7e530CZxIWbbnY5/eRVy9ik7UioUF2d3A6DHP7EUsX+SXphmDt0eIAQ uNImFHJbOLTHwWA2yIkEExXIidKSHtU77ivAFnYPqhdxWeRUZxiM5pOQByUMDSrGjhwJ lLgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493645; x=1749098445; 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=2BpKlJL8pzkzbqgm7fgbbElRoUwnyGMPhhJWvEjPnCw=; b=HVBhv7MsQNuUCp6iI3543JQ23L3raZEBlBITzXTk+fBCyNjQtmI/szDocflIj1Vr7E 5NPvvFNy4AiCwGF1zndgFyOgDAFSvAMQUsI81GJBbmHAWRi/6Ap3yeMl9S8ww3m+iYpC hxiVPR7oLGn8FYSwrM8Sb1JAKIzQAk6Cd8W2Xu6nmPoVybKZxe9Bu5LBh4hRFIfTQwVq qpo2+AtnUjTvmPPSAKBuXhZwkMK3UiSNkjDe0x0oYQGMfxrb+cjyTHu3Gj1WJafYrDHH OSPvS7SDBEBGjpo/q+OKuNGBf0n622B8J7vhdse6xwITXxi4O2cdAXcxWRTcPPv9Bgwr hmLg== X-Forwarded-Encrypted: i=1; AJvYcCUWi5HvTKgir4jXPdobkUaX395j+ULzyrG4UPGyCFdcgA/7ET0YxnHBOT30m96VqVLzPC43ZjbJ2cON8YA=@vger.kernel.org X-Gm-Message-State: AOJu0YwSWdb18cnhnFQQ5GF7Tg1i9hB1/SiZwhV9ECA8o9wuy1VBwxBd di+d9HhUo36xRQAOa2pvbnQmyKCqtTc9xtQ7RofCb7BpKdph2GLvYsffDwA2kBeXskW/dXSH1mx ZNJUS81nU5Q== X-Google-Smtp-Source: AGHT+IFVqtbndzuo7nxvSEKRMaPAublvvL5GrZMwdXD5ql+gcaO8MsxgTKp2KUN3L5eDoC3TUaRbG7RA6HnG X-Received: from pjbsf15.prod.google.com ([2002:a17:90b:51cf:b0:311:ea2a:3919]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3b41:b0:30a:4874:5397 with SMTP id 98e67ed59e1d1-311e7403565mr9110666a91.9.1748493644795; Wed, 28 May 2025 21:40:44 -0700 (PDT) Date: Wed, 28 May 2025 21:39:55 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-20-irogers@google.com> Subject: [PATCH v4 19/24] 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 66569ec4410e..ca76423d81da 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -774,7 +774,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; @@ -790,7 +792,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 2025 Received: from mail-oa1-f73.google.com (mail-oa1-f73.google.com [209.85.160.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 8A10E25D90D for ; Thu, 29 May 2025 04:40:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493649; cv=none; b=EZtMFeCxNRrI5+jGwgQTPrRe/AWB+awwYqpcpZhDnt3E65eFG27O/OqEi6IGU3BfCGRTs0oFGp2JqtyaveUx7F+lCev084w0n6ckfc+vkkmnaa/+ZNx4f9OmvLmOa7zj9IizVBwyK28Reis+LS/FqGax5P3V699u8BlLv5UYB64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493649; c=relaxed/simple; bh=I0KfEuSKoaW88SLE2xfX/II6kEnnhOycNjsY3UTEYsQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Awg2k5nzsg5/Yt/VEavQFf9yOT9GH+/lypdsjpOBVGtXucho9yAMemIHKgN9EbqXpHB6h9ZXuBh/h6HkVzVxMCoVyOFZq4zyiW8AnJLtIyI0ZOdhxBB/vjyJ+/nfkswM42h6KpUH3A9bb0L/BtrWJALyGfiVmPK18Ck6uurH9Bw= 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=q3art21V; arc=none smtp.client-ip=209.85.160.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="q3art21V" Received: by mail-oa1-f73.google.com with SMTP id 586e51a60fabf-2e90e7f170eso76248fac.3 for ; Wed, 28 May 2025 21:40:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493647; x=1749098447; 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=LL4UI9Ak9yHPX0+RiSe0aBEBn7zdKmhXGNAKhA0mqbU=; b=q3art21VYRkppJt/szZbXS1Z8E2IiTKMY0FtY8aN/WHTqNihZdnMs4YoBLs92O3NOE kdzC2LFHkBU2GQEZPPhethQIg2L8+kaCZ65Q56LfsVlLcLOP8jV2XCQ/XTmU1zENgjir fQNwYq4kf6z4c63ZDq2zznHwFFFsRMq26kYTw2caMsSfMpxsXcZUtXTZHMa+r0ypylbI J+vgC4bzbXoh7UcM9A7WSsfR35dyLBsOkAyvNp+BD46Sv1Gb4SSW/74u8/htBkL2BjGN kBlSmMlrjjO3YeohIcj9Baxm49V4FzolhQuG37dHlot+RiK/7sIiGbIzPVQvWXPAUsV0 Xspg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493647; x=1749098447; 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=LL4UI9Ak9yHPX0+RiSe0aBEBn7zdKmhXGNAKhA0mqbU=; b=pCoGLwxNJ63Dof1vgS/dllv4TUWLNXto8PW1XIlDeIM8t57FVN5oC7qQA9k+RtBTxF sEsVjlt/Hnn8boSQguKVlAvTqTv8Qw4hP8rispYUW+RLcT3/4Dl6c8rPGGq+8DDjxVMX SEQ2xKugCAuHQTz7cjoFplzFQTRNRbyovv4KmZZZ59jiQmr1Adcj/PXV9ZIfY8P5OHAX CPF4kgXF1SVGWAahnF4y9p0382PjNeJ5BOL8kKkupjpLm/P/UpnoEF6FJEh4JLXZYOkY N59VD2mp2j8ktm0ZvfWFnFbIdot+sc0GWj/7COfflX3xY+J2JsaT7+jXXmYAiAxcciqD 3/7A== X-Forwarded-Encrypted: i=1; AJvYcCXVCfWReEb8DVuIZp0ynLtB3/p0aEgkMO6wtrd9/ckafqOz0TbbwDHf7QElG7Ts4rZYbB2cYU0j14AmkPk=@vger.kernel.org X-Gm-Message-State: AOJu0Yytd87sb8KVnISpYodUGeP5itNxjrUkSuGqcqWlP9JBVDXPnIKx OuX9e5s8eM1Ck6OHJH+2+23p9fveIp0jj22EXsCEkuM/Zv+NdQjDfauy7biw1mDEkgKrh/zkvHX xss0WiJ9+cw== X-Google-Smtp-Source: AGHT+IF/B4xbYCms04sU6/ziRl8z3n1U/RtRzWjX1PIW5CRINULWhPl3JsZ83qpBCY7gPqUUQKJwe7n6GeO8 X-Received: from oabqw14.prod.google.com ([2002:a05:6870:6f0e:b0:2d6:b51:2d37]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6871:8005:b0:2d4:d820:6d82 with SMTP id 586e51a60fabf-2e8e10cd09bmr2652554fac.26.1748493646684; Wed, 28 May 2025 21:40:46 -0700 (PDT) Date: Wed, 28 May 2025 21:39:56 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-21-irogers@google.com> Subject: [PATCH v4 20/24] 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 af1cb6a5ba1c..bf374844e200 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -2901,13 +2901,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) @@ -2993,8 +2986,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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 92D4F25E46F for ; Thu, 29 May 2025 04:40:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493651; cv=none; b=JCao6Y/GRiny4mNiStXt5nlg/xIcDX9oURnw//TLv5kSzAT4ROMT0KM58yK16u7/9ErYuoO8lVkt1pxa+vMapeSHo43DK1FjLf2FNkDyUzif6IW5ISKXGbHAjWq7TkYv+nGtuo8uMWoOIpbcXZaeDhBGV7+hivXyVpPFXS8At9U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493651; c=relaxed/simple; bh=ITCVHe+DZaUEl150e02sgRTFkhGt7andQJs7OHtEtwo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=hQwPWjyePEAI9NCIw2YsmPOhWSjO9BnKBdOiJ07TJfNsLQ09EUHVFA4lBZfNdrPy1TFXy//N4JrwoMxNvTgSEFrN431lcIXY5hVRTMbjFu8JZozigWA80QBWb+JxQmDuHHxtX1fBaEYDGmArLnT1FRBgRaeqeJQAv8SpHljAEiA= 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=D/ZWlLyR; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="D/ZWlLyR" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-234d7c0524cso6513275ad.2 for ; Wed, 28 May 2025 21:40:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493649; x=1749098449; 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=aoixhGOv9OF6VrQYlQQ3Ye/bVfiGpPjQeS0mXQLBUMg=; b=D/ZWlLyRNBS2geVfXNOp5rSzPTJq0+nfs28tWawoE1YWiA7YZD7e9rmq392hJBd3Ns 6vKzG3qafRW6DC7o7QP+4L4x3TX1Ll6iETAURSJx36/ls8UTVGhR0IJiasfLMXJ03UBS MwtCrj3+NQ1s6ZpVdcu7EGPgaNCOvmodoxURyQ/fA6Y6eDqNshorsm9RLJGYTZvaSwGo d0v9KPC9/x875SBr8GOFM8HNOBoKmvCW6IpoM0/QuZQAB7puId381fSwljdqOs0BIghN IKi2Zja0853x0h5Zm8a2RWYNzltiS4IenYBlIhxT256s0EnySRS4BuQeNUSAhF5aR06T K65g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493649; x=1749098449; 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=aoixhGOv9OF6VrQYlQQ3Ye/bVfiGpPjQeS0mXQLBUMg=; b=k9Y3RiWMkz10hzS7UtjO5qOEF4caYMoFMsNc3YWDTybuS2LoAnosZ4MHPTUNBHFysf vWd4Zz9LUuO8nyxFbV0SnPtW8CgiHtwTzeW8KCF5FAjetHVKq+XZns8dTSKsqENBLI1+ XcoVfDZA+sGzWQ8aMMEG7VkkCs+nYYDFr4Q5UsKQYiAxs4Zpu/ctrIKi9jzmd/1cewfI eoeEjKZIZQd6BzCJeS2iQoKAveyXVmwGBjjm5py0aMdJiRIu1GEXDBMBBeIDMed14vyC DvHQG1XJlwgEXX6sXmuxoTsrBHcdSlmf9fba3Mbdny5ioaydrpO0en3q+e3Mjq62SrpG RbhQ== X-Forwarded-Encrypted: i=1; AJvYcCVVEcbITerhBNeYJQEmHdbwE5wRx2kwI7P1k4cvHmU0JisX/GTaAsPvzk6ZXuC7i5clHpJZAxzgZHQA+t0=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6FeHwDZYDPXStBRCIjCZCVN1RllvqUmADfvMHkX0RhC3EvagI 6u6omQgNu2VFUd3bP1MRW9G0eSD/Q/FnRrgdzx+wRbtTypQiLwZBJEc/ce2c3YEoe1/CURilwhC apyOAwRw9Bg== X-Google-Smtp-Source: AGHT+IFezOAK1i5u0sK5P2v341T5yA5TGxCciTZYzCEh2vrLBwrPJa3lXiFC9JI3IMcHGhsvojvyrE8csfyX X-Received: from plll21.prod.google.com ([2002:a17:902:d055:b0:234:949d:4a5c]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2283:b0:234:9092:9dda with SMTP id d9443c01a7336-23490929e16mr191800245ad.24.1748493648817; Wed, 28 May 2025 21:40:48 -0700 (PDT) Date: Wed, 28 May 2025 21:39:57 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-22-irogers@google.com> Subject: [PATCH v4 21/24] 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 c67e3ec938d0..f27890d5cfbb 100644 --- a/tools/perf/util/bpf-event.c +++ b/tools/perf/util/bpf-event.c @@ -184,7 +184,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 b363c933e782..02cf7670a52b 100644 --- a/tools/perf/util/env.c +++ b/tools/perf/util/env.c @@ -17,8 +17,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 d90e343cf1fa..9c6eaaf68c3e 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 9b477cc73c85..0fa17414432f 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -192,7 +192,8 @@ struct perf_session *__perf_session__new(struct perf_da= ta *data, symbol_conf.kallsyms_name =3D perf_data__kallsyms_name(data); } } else { - session->machines.host.env =3D host_env ?: &perf_env; + assert(host_env !=3D NULL); + session->machines.host.env =3D host_env; } if (session->evlist) session->evlist->session =3D session; --=20 2.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 CE088254B18 for ; Thu, 29 May 2025 04:40: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=1748493654; cv=none; b=swpPazSZEZURG4hB7fOqUxE0aHrM1fL8DZD9njBJ20CMVoGulZr8Jve8s/hI7WhbD5MJPqq5tYh1668vvBYwqdz8d7kIc8D3YkTf99h94Z6t2zgJLtJtXMj2XgvWXr/WofYU3cht8GxQ7Z36cmJA96nBJOacIXaYBWww3iC3OLU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493654; c=relaxed/simple; bh=Kw1h3zbcO0+nbNVZ4xRKQB7TXsrfeOqnRRvda6og5T0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=hzJZlA23fxXjL0hZFh7WtmpWbBUpFl0mr27IyGiiDZ7qJj7/C6ew8bP6OeLVzVOIRPaAC/GD/OHwRDmUjHNhYXv+J0KHILe1JDnBuLkihVlnchMoKobpEUnSYz8YK8wJB6nteQEY+Ijb3rcU2NTNoTIvOgUzCtltUH38LjbyVz0= 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=AnNqYodd; 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="AnNqYodd" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-311ef4fb5eeso463005a91.1 for ; Wed, 28 May 2025 21:40:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493651; x=1749098451; 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=NckW1LGcEQkasG851ugyz/vuJiSbVnljXnZdECeSHa8=; b=AnNqYoddPANTi/AGn/aTDkEVR+rVtCDBB9u5DmIcHC2sx3OQcuBsXDQLsMYQw955XS tROpHUSqoiBwljb5sXmlOEZ80JbitvZJ9l1UrWstag8LLb7OYbpAJVT0S+9Tdv5m9+ns iIYy1m5ORuZCbHAhNDqKUaVYWt/3Nmp3qx/hZz8eAbRs9k7kXPUyUgwpcQnWAKvp9PK+ UNn1Eif99+BqviFfKyE/T7nfoUKAIsZwBebG70zfD1Jy/d42SAoQVae/MObAUDp2/2LI l8FR1PProKRBwY8MBfcdtLYelEwXQTISyQ2zlGwTuE6ISZ23ZEpKwF9NHMCrrsAXya79 HnIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493651; x=1749098451; 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=NckW1LGcEQkasG851ugyz/vuJiSbVnljXnZdECeSHa8=; b=wZAIxXAm7jmpp6XMq8Vb449D/556mCk5/8RXAcAnxWGkCbYcWWZ32odkX6CYWJeHNF 9q4hJt4HlSIsHVEpzXxWhrzSaJ+vdK1bz3WzMHLCM/3CBxcQSXQpYHZjmz3zvcrw7WbK evK04TYigGaisBC6yZeAjIKdRyJw9TVmNAjM0vVIF5SoqzgWkT5LvkGJTKuMPBZRdBfl 03U1ZYzHtkBz72ZoMZHyAOcmVIVLvB3YuMYtq6vUINV0Bh/bLc6c/Sfi+nVcYRsSLjiG ikciM76FMBdxIfNv29xPgrUrzyNKxtMpHw+Jh0ZJhgbQ3g/Ljm8T0X0aOnAkuxWH7nHV AY1A== X-Forwarded-Encrypted: i=1; AJvYcCUA/17sGFHlfEpYgDkDLJyNC2gxl99TXjKhK+AlYR8THvxzIrZtfd+ik6dl090FcuvQxP7YF8gHw2Nak54=@vger.kernel.org X-Gm-Message-State: AOJu0YwUc1pgacx+FGa8VWhm54SvXW9TBIHumECkO7q/GXYXTbz4yWCg SGolZxkDJBqOCSZgvOeQE1VHE5KsbBY8+3jGqEZf2f/tdIdY8+f74SEMUdJ5t+a9PHXouT6C8uT kUeFjML4wHw== X-Google-Smtp-Source: AGHT+IFSmPOlM8GyBfmuiSFawgCN+6AyecpP7u+Q6vxtBq9lbBJt8pNCfZ4EmKNpJ6P55/zpi9xcHUDKwNuJ X-Received: from pjbsi16.prod.google.com ([2002:a17:90b:5290:b0:311:b365:7e83]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:164b:b0:310:8d4a:4a97 with SMTP id 98e67ed59e1d1-31214ee68f2mr3156851a91.15.1748493650804; Wed, 28 May 2025 21:40:50 -0700 (PDT) Date: Wed, 28 May 2025 21:39:58 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-23-irogers@google.com> Subject: [PATCH v4 22/24] 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 165668d67a6a..c6eb66dbf4b6 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2251,7 +2251,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 664bf39567ce..119bce37f4fd 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -390,8 +390,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 4ad4bc118ea5..b8d6ed3ff3df 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -202,8 +202,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 0fa17414432f..38e3d6262e8b 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -1099,7 +1099,7 @@ static void dump_sample(struct evsel *evsel, union pe= rf_event *event, printf("... weight: %" PRIu64 "", sample->weight); if (sample_type & PERF_SAMPLE_WEIGHT_STRUCT) { printf(",0x%"PRIx16"", sample->ins_lat); - printf(",0x%"PRIx16"", sample->p_stage_cyc); + printf(",0x%"PRIx16"", sample->weight3); } printf("\n"); } diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 7969d64a47bf..0ba2ce1b1c07 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -1884,21 +1884,20 @@ struct sort_entry sort_global_ins_lat =3D { static int64_t sort__p_stage_cyc_cmp(struct hist_entry *left, struct hist_entry *right) { - return left->p_stage_cyc - right->p_stage_cyc; + return left->weight3 - right->weight3; } =20 static int hist_entry__global_p_stage_cyc_snprintf(struct hist_entry *he, = char *bf, size_t size, unsigned int width) { - return repsep_snprintf(bf, size, "%-*u", width, - he->p_stage_cyc * he->stat.nr_events); + return repsep_snprintf(bf, size, "%-*u", width, he->weight3 * he->stat.nr= _events); } =20 =20 static int hist_entry__p_stage_cyc_snprintf(struct hist_entry *he, char *b= f, size_t size, unsigned int width) { - return repsep_snprintf(bf, size, "%-*u", width, he->p_stage_cyc); + return repsep_snprintf(bf, size, "%-*u", width, he->weight3); } =20 struct sort_entry sort_local_p_stage_cyc =3D { diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 638d7dd7fa4b..6afdcfd14224 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -1573,10 +1573,16 @@ size_t perf_event__sample_event_size(const struct p= erf_sample *sample, u64 type, return result; } =20 -void __weak arch_perf_synthesize_sample_weight(const struct perf_sample *d= ata, +static void perf_synthesize_sample_weight(const struct perf_sample *data, __u64 *array, u64 type __maybe_unused) { *array =3D data->weight; + + if (type & PERF_SAMPLE_WEIGHT_STRUCT) { + *array &=3D 0xffffffff; + *array |=3D ((u64)data->ins_lat << 32); + *array |=3D ((u64)data->weight3 << 48); + } } =20 static __u64 *copy_read_group_values(__u64 *array, __u64 read_format, @@ -1736,7 +1742,7 @@ int perf_event__synthesize_sample(union perf_event *e= vent, u64 type, u64 read_fo } =20 if (type & PERF_SAMPLE_WEIGHT_TYPE) { - arch_perf_synthesize_sample_weight(sample, array, type); + perf_synthesize_sample_weight(sample, array, type); array++; } =20 --=20 2.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C41C2550A6 for ; Thu, 29 May 2025 04:40:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493656; cv=none; b=qpqyENd0Qyhe9umbgR4OXBDRwDzlCdYyHIRY1xfKkGRICtkP2zupeVabB8vMs8D1OHNiuCVtvzVwSLuR1x6p1eItgtXXyNSV2okr630iwuwSgeKgRYArmQC/x/LZHld/TcIRL6hhbIEDF+aTCbXRxuqDqha4tTiPkqqpzyT0Bdo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493656; c=relaxed/simple; bh=6+Sf06lY23vskaDOo2rIctSVCTg73vAujkOWWsn8MQU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=aAZGnUEgT2wUg219TpGzMMi600ARorCcgFogmuwx+vVfx/e6wDZMHQ1DjVvVO5TG9H/QYjRSzNh1GZvgdsArDJ0Cvesr6uw5Zhi0XhfvnxRvw/m7N9NbvWxO7A9+he75ug2MJPzvqMuv3pbbHZRFPExSakX/OdcVWUmk8egueVg= 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=rn5q6uyw; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="rn5q6uyw" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-22e7e097ef7so5182805ad.2 for ; Wed, 28 May 2025 21:40:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493653; x=1749098453; 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=m3l9gFzeV+4CwiZPl0bk8NIcOEx0Oe+RvzDt6jbvfKI=; b=rn5q6uywEVYNufdoJYigZ8Yp772+htMNXy9ptgJeGZyvsCb/dcTrQpCCrflHVgY1Ps o2+Cej/Cz0udh3eevs+anUZ2mSRsLV+ravjR32U0mc14pENMtMXs00yhiKvBlxcq87Va eekukjOeM+WdLdzm6A1yF9lF+NroxM6NLwwym9zE7tDVsAKmkePf0QI0TwXzG3Agfcuf 5ODZytEr2jQKXTYLap0i4B01gnM2hkfxq0t+mGDX8hRNXoE3LSal9Ug2XPbCPXiVHKHO p6anZWYARoyiOZp0WLO1Wdv5/spTUeOHj8Ii0ZyMv+C3fx2jVDGDnH9/IPqT+yl1jjn4 OZxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493653; x=1749098453; 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=m3l9gFzeV+4CwiZPl0bk8NIcOEx0Oe+RvzDt6jbvfKI=; b=KIC04PL6WPkYEtizC+3/Ip4W4WrGRhnl9fswwUJGnXYAxmuEOEstor/Weh7tclarXM WLHODjrIsSA17/UelImyJg+mg/S9MlG/Myi4c2fSsfGt2sdoOAR7dYnbmFlbFlzUokuy lKKoqccopJFeh/xNABYUJ+nE/ERmUx2+TH7AKAJhbyFmVFJMkTpKYs4ddZFx5P5tGP5h uZ/klTaDX5A+DjmQAUXTzNEzq2bXIiYuF1M74xWVyK3Hj/1pjwN+ReBnVj61XJhDi8lG 3O9zAI0+sF99YyNQtdHfA6xQlff68a7eAkNK8l09sNwk7+ZCm3pY+m0F+WRNbEGUCbUk HqhQ== X-Forwarded-Encrypted: i=1; AJvYcCUBpz2PvJx7XVCSfDlBBDYAjE8P90kyMfS/hziQgCtz9tUPNcKg5KhgNhfImuDmx0DpylVu1zz/bxE4FZM=@vger.kernel.org X-Gm-Message-State: AOJu0YwocDPt9P/hflcj9yR2aTCj0JwjMOPU4qyS+uyX7KPekrw9f/X6 CuWXLvqJuLokQFKGVtYtkoakfUpDZ2u7YiHmwZT9AFACYPX6zCmzNQUpCspNMWloTiv/HINx1gS /6j79ADooiQ== X-Google-Smtp-Source: AGHT+IF5rigleOtOsrUrxD6nqvCMJw+Fv5BWmxf8o1mnR20lROPpC4bcbnTNyytgGnktY+zzDtjiC9y9FWzc X-Received: from plrx8.prod.google.com ([2002:a17:902:b408:b0:234:27ee:cd31]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f7c3:b0:234:986c:66e4 with SMTP id d9443c01a7336-234986c6ba5mr121960995ad.12.1748493652760; Wed, 28 May 2025 21:40:52 -0700 (PDT) Date: Wed, 28 May 2025 21:39:59 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-24-irogers@google.com> Subject: [PATCH v4 23/24] 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.49.0.1204.g71687c7c1d-goog From nobody Tue Dec 16 14:36:05 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 DAA9525FA29 for ; Thu, 29 May 2025 04:40:55 +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=1748493658; cv=none; b=mmEvbcC2Ap6FpL7E2cQdQo//23le+T1GevKM9pEhwDorrwFZPMxY4l28hmd3J1s6zVbtz/enTkWZGsqN8rXNMaE7hSIHnw04i0VwcpNJSnaKhBip4VcK7/rTfZRQPts2hncNStif+JfUDM97bL/kPxTjP2NWhzr+gfakh791rqE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748493658; c=relaxed/simple; bh=WlX5/RZmfx1ST+zEmoUfADR/sSYHXhM2DQYrpX4A43Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=upeTrYCT+rwrjB+R/WUjPcGKRHrY7vx3Ck2be0bQtnlJ/oN87vNbZWw127hy1MoyWBdJAkeh0db7PxVFXCtXrAxahxcVHo+ru2ynvG//WKafY/2LsA1O/8Z5IyaOJpLeu8vY6LwbqzPTYfIW33SVXvT6prI7MPWvbd4F9xeLVtI= 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=JVrA/oln; 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="JVrA/oln" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-311dbea6c10so702324a91.0 for ; Wed, 28 May 2025 21:40:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748493655; x=1749098455; 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=lTb1Lq244rE9Rgu1qNJXYWEKBEnbei8JgAvxHTEwZos=; b=JVrA/oln+D4YVMQgAFvybjY+Ten4Abfdhj0ZQGntcvC9Kw3CHLs6exfN8O0JIBXFbh L0yifvyPCVSZnXBby8q1CWy/KgmJSL/UEpoay8hthSrF7GcAv/ruggDmhWDSYaXwbimS DmhlVOnVpkU7sCBrBTv+Z2PuWbXSeDO+2AaNEF9GSW4VbqSCEheccj1PGujF3bcCotS/ 6kb1AkYc4DGGenV+Zv7JW5tOhoqJ1Spg6qWeOryewr9xWL0jt2Y56/aWb+4oh6/IZWeL MYHruyE7/arbpe0gt5DRSKijWNh+hdDfMJ3g59ozaGFjp+dhGxypF//lYnL+l/9r3fwz Z69Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748493655; x=1749098455; 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=lTb1Lq244rE9Rgu1qNJXYWEKBEnbei8JgAvxHTEwZos=; b=xGuwngSHqqm9JqRQLkBW9xaELW5EknRVvGElW3+0+8VBdWhPguok8dtJ5JhSRhwmAw 5rdolu1md8JD1OGdfxuDTc4rgEC5v5/Vbz6jI58vyHwsUSH9vfHfHbrfE0WSW28bGuy7 x21IgDSTda2voK1PV7eZzNwCWtd8oIwtDsHSOfqD6dA/ZGUV3Y7ChZSfnDMPw741Bh2S W1h3y/FM0rqs27VLpKsEQyo/aInz6WegefBc0RLQWffnAuqDP4fMIsiC9auVrKwpfjFo TuP+xawnUviXdb0xXcnwn+QSYPKdbEpEY5R2CQAGe23i+7Mk3NZtBAmeqvqehnc6RMJI eM7w== X-Forwarded-Encrypted: i=1; AJvYcCWT6cXF2gPrgEejdoIMvMRvIzTK9BlAs1Uor+zLDp1n8fC4UXb1whPrpVvRZGS25Q5x1NWQv8oeuL9bpeY=@vger.kernel.org X-Gm-Message-State: AOJu0YxzFIZMGpH2rTZD7cCUhEUtOdTH7lTP/pC8kZny+90EOAw1Bu6Q TwERSQTTPWrr/dt/2gUjDdwaoENgwYvpB2tJJlWqOEf9p7IkD101sg8c/S8jHAPr8JqE8mkJNeX ybEt9ley4wg== X-Google-Smtp-Source: AGHT+IEP6uAczS21PEBczb3u+yIA5CjW/6ocetN/x3gov9GN57eogeWbfe54Zh6dGbIJcUEh9BL3Rau+lQgM X-Received: from pgah11.prod.google.com ([2002:a05:6a02:4e8b:b0:b2c:41dc:da38]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:7484:b0:1f5:717b:46dc with SMTP id adf61e73a8af0-21acbadd0aamr1087803637.27.1748493655174; Wed, 28 May 2025 21:40:55 -0700 (PDT) Date: Wed, 28 May 2025 21:40:00 -0700 In-Reply-To: <20250529044000.759937-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: <20250529044000.759937-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <20250529044000.759937-25-irogers@google.com> Subject: [PATCH v4 24/24] 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 6953c2c8519b..89f3d4d5f017 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1787,7 +1787,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 2327496296be..3ec826611a0d 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) @@ -1832,16 +1842,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 119bce37f4fd..3b97a31736c5 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -390,9 +390,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.49.0.1204.g71687c7c1d-goog