Patch "perf intel-pt: Fix MTC timestamp calculation for large MTC periods" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
perf intel-pt: Fix MTC timestamp calculation for large MTC periods
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
perf-intel-pt-fix-mtc-timestamp-calculation-for-large-mtc-periods.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
3bccbe20f6d188ce7b00326e776b745cfd35b10aMon Sep 17 00:00:00 2001
From: Adrian Hunter <[email protected]>
Date: Wed, 28 Sep 2016 14:41:36 +0300
Subject: perf intel-pt: Fix MTC timestamp calculation for large MTC periods
From: Adrian Hunter <[email protected]>
commit 3bccbe20f6d188ce7b00326e776b745cfd35b10a upstream.
The MTC packet provides a 8-bit slice of CTC which is related to TSC by the TMA packet, however the TMA packet only provides the lower 16 bits of CTC. If mtc_shift > 8 then some of the MTC bits are not in the CTC provided by the TMA packet. Fix-up the last_mtc calculated from the TMA packet by copying the missing bits from the current MTC assuming the least difference between the two, and that the current MTC comes after last_mtc.
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 36 ++++++++++++++++++++ 1 file changed, 36 insertions(+)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +36 -0
@@ -89,6 +89,7 @@ struct intel_pt_decoder {bool pge;bool have_tma;bool have_cyc; +bool fixup_last_mtc;uint64_t pos;uint64_t last_ip;uint64_t ip;
@@ -584,10 +585,31 @@ struct intel_pt_calc_cyc_to_tsc_info {uint64_t tsc_timestamp;uint64_t timestamp;bool have_tma; +bool fixup_last_mtc;bool from_mtc;double cbr_cyc_to_tsc; }; +/* +* MTC provides a 8-bit slice of CTC but the TMA packet only provides the lower +* 16 bits of CTC. If mtc_shift > 8 then some of the MTC bits are not in the CTC +* provided by the TMA packet. Fix-up the last_mtc calculated from the TMA +* packet by copying the missing bits from the current MTC assuming the least +* difference between the two, and that the current MTC comes after last_mtc. +*/ +static void intel_pt_fixup_last_mtc (uint32_t mtc,int mtc_shift, +uint32_t *last_mtc) +{ +uint32_t first_missing_bit =1U << (16 - mtc_shift); +uint32_t mask = ~(first_missing_bit -1 ); + + *last_mtc |= mtc & mask; +if (*last_mtc >= mtc) { + *last_mtc -= first_missing_bit; + *last_mtc &=0xff ; + } +} +static int intel_pt_calc_cyc_cb (struct intel_pt_pkt_info *pkt_info) {struct intel_pt_decoder *decoder = pkt_info->decoder;
@@ -617,6 +639,11 @@ static int intel_pt_calc_cyc_cb(struct ireturn 0 ; mtc = pkt_info->packet.payload; +if (decoder->mtc_shift >8 && data->fixup_last_mtc) { + data->fixup_last_mtc = false; +intel_pt_fixup_last_mtc (mtc, decoder->mtc_shift, + &data->last_mtc); + }if (mtc > data->last_mtc) mtc_delta = mtc - data->last_mtc;else
@@ -685,6 +712,7 @@ static int intel_pt_calc_cyc_cb(struct i data->ctc_delta =0 ; data->have_tma = true; + data->fixup_last_mtc = true;return 0 ;
@@ -751,6 +779,7 @@ static void intel_pt_calc_cyc_to_tsc(str .tsc_timestamp = decoder->tsc_timestamp, .timestamp = decoder->timestamp, .have_tma = decoder->have_tma, + .fixup_last_mtc = decoder->fixup_last_mtc, .from_mtc = from_mtc, .cbr_cyc_to_tsc = 0, };
@@ -1241,6 +1270,7 @@ static void intel_pt_calc_tma(struct int } decoder->ctc_delta =0 ; decoder->have_tma = true; + decoder->fixup_last_mtc = true;intel_pt_log ("CTC timestamp " x64_fmt" last MTC %#x CTC rem %#x\n" , decoder->ctc_timestamp, decoder->last_mtc, ctc_rem); }
@@ -1255,6 +1285,12 @@ static void intel_pt_calc_mtc_timestamp( mtc = decoder->packet.payload; +if (decoder->mtc_shift >8 && decoder->fixup_last_mtc) { + decoder->fixup_last_mtc = false; +intel_pt_fixup_last_mtc (mtc, decoder->mtc_shift, + &decoder->last_mtc); + } +if (mtc > decoder->last_mtc) mtc_delta = mtc - decoder->last_mtc;else
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/mmc-sdhci-cast-unsigned-int-to-unsigned-long-long-to-avoid-unexpeted-error.patch queue-4.4/perf-intel-pt-fix-estimated-timestamps-for-cycle-accurate-mode.patch queue-4.4/perf-intel-pt-fix-mtc-timestamp-calculation-for-large-mtc-periods.patch queue-4.4/perf-intel-pt-fix-snapshot-overlap-detection-decoder-errors.patch