<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:新細明體;
panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"\@新細明體";
panose-1:2 1 6 1 0 1 1 1 1 1;}
/* Style Definitions */
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
{mso-style-priority:99;
mso-style-link:"純文字 字元";
margin:0cm;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ligatures:standardcontextual;}
span.a
{mso-style-name:"純文字 字元";
mso-style-priority:99;
mso-style-link:純文字;
font-family:"Calibri",sans-serif;}
.MsoChpDefault
{mso-style-type:export-only;}
/* Page Definitions */
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
{page:WordSection1;}
--></style>
</head>
<body lang="ZH-TW" link="#467886" vlink="#96607D" style="word-wrap:break-word;text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoPlainText"><span lang="EN-US" style="font-family:"Courier New""></span><span lang="EN-US">James Clark
</span><span style="font-family:"新細明體",serif">於</span><span lang="EN-US"> 2024/6/25 21:30
</span><span style="font-family:"新細明體",serif">寫道</span><span lang="EN-US">:<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> This will allow sessions with more than CORESIGHT_TRACE_IDS_MAX ETMs<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> as long as there are fewer than that many ETMs connected to each sink.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> Each sink owns its own trace ID map, and any Perf session connecting to<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> that sink will allocate from it, even if the sink is currently in use by<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> other users. This is similar to the existing behavior where the dynamic<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> trace IDs are constant as long as there is any concurrent Perf session<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> active. It's not completely optimal because slightly more IDs will be<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> used than necessary, but the optimal solution involves tracking the PIDs<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> of each session and allocating ID maps based on the session owner. This<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> is difficult to do with the combination of per-thread and per-cpu modes<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> and some scheduling issues. The complexity of this isn't likely to worth<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> it because even with multiple users they'd just see a difference in the<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> ordering of ID allocations rather than hitting any limits (unless the<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> hardware does have too many ETMs connected to one sink).<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> Per-thread mode works but only until there are any overlapping IDs, at<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> which point Perf will error out. Both per-thread mode and sysfs mode are<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> left to future changes, but both can be added on top of this initial<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> implementation and only sysfs mode requires further driver changes.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> The HW_ID version field hasn't been bumped in order to not break Perf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> which already has an error condition for other values of that field.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> Instead a new minor version has been added which signifies that there<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> are new fields but the old fields are backwards compatible.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> Changes since v3:<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Fix issue where trace IDs were overwritten by possibly invalid ones<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> by Perf in unformatted mode. Now the HW_IDs are also used for<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> unformatted mode unless the kernel didn't emit any.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Add a commit to check the OpenCSD version.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Add a commit to not save invalid IDs in the Perf header.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Replace cs_etm_queue's formatted and formatted_set members with a<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> single enum which is easier to use.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Drop CORESIGHT_TRACE_ID_UNUSED_FLAG as it's no longer needed.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Add a commit to print the queue number in the raw dump.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Don't assert on the number of unformatted decoders if decoders == 0.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> Changes since v2:<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Rebase on coresight-next 6.10-rc2 (b9b25c8496).<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Fix double free of csdev if device registration fails.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Fix leak of coresight_trace_id_perf_start() if trace ID allocation<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> fails.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Don't resend HW_ID for sink changes in per-thread mode. The existing<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> CPU field on AUX records can be used to track this instead.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Tidy function doc for coresight_trace_id_release_all()<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Drop first two commits now that they are in coresight-next<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Add a commit to make the trace ID spinlock local to the map<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> Changes since V1:<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Rename coresight_device.perf_id_map to perf_sink_id_map.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Instead of outputting a HW_ID for each reachable ETM, output<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> the sink ID and continue to output only the HW_ID once for<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> each mapping.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Keep the first two Perf patches so that it applies cleanly<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> on coresight-next, although they have been applied on perf-tools-next<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Add new *_map() functions to the trace ID public API instead of<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> modifying existing ones.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> * Collapse "coresight: Pass trace ID map into source enable" into<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> "coresight: Use per-sink trace ID maps for Perf sessions" because the<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> first commit relied on the default map being accessible which is no<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> longer necessary due to the previous bullet point.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> James Clark (17):<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> perf: cs-etm: Create decoders after both AUX and HW_ID search passes<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> perf: cs-etm: Allocate queues for all CPUs<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> perf: cs-etm: Move traceid_list to each queue<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> perf: cs-etm: Create decoders based on the trace ID mappings<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> perf: cs-etm: Only save valid trace IDs into files<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> perf: cs-etm: Support version 0.1 of HW_ID packets<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> perf: cs-etm: Print queue number in raw trace dump<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> perf: cs-etm: Add runtime version check for OpenCSD<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> coresight: Remove unused ETM Perf stubs<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> coresight: Clarify comments around the PID of the sink owner<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> coresight: Move struct coresight_trace_id_map to common header<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> coresight: Expose map arguments in trace ID API<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> coresight: Make CPU id map a property of a trace ID map<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> coresight: Use per-sink trace ID maps for Perf sessions<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> coresight: Remove pending trace ID release mechanism<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> coresight: Emit sink ID in the HW_ID packets<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> coresight: Make trace ID map spinlock local to the map<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> drivers/hwtracing/coresight/coresight-core.c | 37 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> drivers/hwtracing/coresight/coresight-dummy.c | 3 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../hwtracing/coresight/coresight-etm-perf.c | 36 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../hwtracing/coresight/coresight-etm-perf.h | 18 -<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../coresight/coresight-etm3x-core.c | 9 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../coresight/coresight-etm4x-core.c | 9 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> drivers/hwtracing/coresight/coresight-priv.h | 1 +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> drivers/hwtracing/coresight/coresight-stm.c | 3 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> drivers/hwtracing/coresight/coresight-sysfs.c | 3 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../hwtracing/coresight/coresight-tmc-etr.c | 5 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> drivers/hwtracing/coresight/coresight-tmc.h | 5 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> drivers/hwtracing/coresight/coresight-tpdm.c | 3 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../hwtracing/coresight/coresight-trace-id.c | 133 ++--<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../hwtracing/coresight/coresight-trace-id.h | 70 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> include/linux/coresight-pmu.h | 17 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> include/linux/coresight.h | 21 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> tools/build/feature/test-libopencsd.c | 4 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> tools/include/linux/coresight-pmu.h | 17 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> tools/perf/Makefile.config | 2 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> tools/perf/arch/arm/util/cs-etm.c | 11 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../perf/util/cs-etm-decoder/cs-etm-decoder.c | 49 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../perf/util/cs-etm-decoder/cs-etm-decoder.h | 3 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> .../util/cs-etm-decoder/cs-etm-min-version.h | 13 +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> tools/perf/util/cs-etm.c | 625 +++++++++++-------<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> tools/perf/util/cs-etm.h | 12 +-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> 25 files changed, 636 insertions(+), 473 deletions(-)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-min-version.h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Confirmed this series works on the 144 cores / 288 cores systems.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Tested-by: Jeremy Szu <jszu@nvidia.com><o:p></o:p></span></p>
</div>
</body>
</html>