perf intel-pt: Fix estimated timestamps for cycle-accurate mode
Adrian Hunter
reviewerPATCH 1/2 perf intel-pt: Fix estimated timestamps for cycle-accurate mode
In cycle-accurate mode, timestamps can be calculated from CYC packets. The decoder also estimates timestamps based on the number of instructions since the last timestamp. For that to work in cycle-accurate mode, the instruction count needs to be reset to zero when a timestamp is calculated from a CYC packet, but that wasn't happening, so fix it.
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +2 -0
@@ -1353,6 +1353,8 @@ static void intel_pt_calc_cyc_timestamp(struct intel_pt_decoder *decoder) timestamp, decoder->timestamp); else decoder->timestamp = timestamp; + + decoder->timestamp_insn_cnt =0 ; }/* Walk PSB+ packets when already in sync. */
Signature · 1 line
1.9.1
Adrian Hunter
reviewerPATCH 2/2 perf intel-pt: Fix MTC timestamp calculation for large MTC periods
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.
--- .../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
@@ -90,6 +90,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;
@@ -586,10 +587,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;
@@ -619,6 +641,11 @@ static int intel_pt_calc_cyc_cb(struct intel_pt_pkt_info *pkt_info)return 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
@@ -687,6 +714,7 @@ static int intel_pt_calc_cyc_cb(struct intel_pt_pkt_info *pkt_info) data->ctc_delta =0 ; data->have_tma = true; + data->fixup_last_mtc = true;return 0 ;
@@ -753,6 +781,7 @@ static void intel_pt_calc_cyc_to_tsc(struct intel_pt_decoder *decoder, .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, };
@@ -1271,6 +1300,7 @@ static void intel_pt_calc_tma(struct intel_pt_decoder *decoder) } 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); }
@@ -1285,6 +1315,12 @@ static void intel_pt_calc_mtc_timestamp(struct intel_pt_decoder *decoder) 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
Signature · 1 line
1.9.1
tip-bot for Adrian Hunter
merge bot[tip:perf/urgent] perf intel-pt: Fix MTC timestamp calculation for large MTC periods
perf intel-pt: Fix MTC timestamp calculation for large MTC periods
Commit-ID: 3bccbe20f6d188ce7b00326e776b745cfd35b10a Gitweb: http://git.kernel.org/tip/3bccbe20f6d188ce7b00326e776b745cfd35b10a Author: Adrian Hunter <[email protected]> AuthorDate: Wed, 28 Sep 2016 14:41:36 +0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 5 Oct 2016 08:15:58 -0300
perf intel-pt: Fix MTC timestamp calculation for large MTC periods
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.
--- .../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
@@ -90,6 +90,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;
@@ -586,10 +587,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;
@@ -619,6 +641,11 @@ static int intel_pt_calc_cyc_cb(struct intel_pt_pkt_info *pkt_info)return 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
@@ -687,6 +714,7 @@ static int intel_pt_calc_cyc_cb(struct intel_pt_pkt_info *pkt_info) data->ctc_delta =0 ; data->have_tma = true; + data->fixup_last_mtc = true;return 0 ;
@@ -753,6 +781,7 @@ static void intel_pt_calc_cyc_to_tsc(struct intel_pt_decoder *decoder, .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, };
@@ -1271,6 +1300,7 @@ static void intel_pt_calc_tma(struct intel_pt_decoder *decoder) } 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); }
@@ -1285,6 +1315,12 @@ static void intel_pt_calc_mtc_timestamp(struct intel_pt_decoder *decoder) 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
Adrian Hunter
reviewerQuoted 8 lines · Adrian Hunter
In cycle-accurate mode, timestamps can be calculated from CYC packets. The decoder also estimates timestamps based on the number of instructions since the last timestamp. For that to work in cycle-accurate mode, the instruction count needs to be reset to zero when a timestamp is calculated from a CYC packet, but that wasn't happening, so fix it.
Signed-off-by Adrian Hunter <[email protected]>Cc [email protected] # v4.3+
Hi
These 2 patches are still outstanding when you have time.
Regards
Adrian
Quoted 18 lines
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 2 ++ 1 file changed, 2 insertions(+)tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +2
-0@@ -1353,6 +1353,8 @@ static void intel_pt_calc_cyc_timestamp(struct intel_pt_decoder *decoder) timestamp, decoder->timestamp); else decoder->timestamp = timestamp; + + decoder->timestamp_insn_cnt =0 ; }/* Walk PSB+ packets when already in sync. */
Arnaldo Carvalho de Melo
maintainerEm Wed, Oct 05, 2016 at 10:33:14AM +0300, Adrian Hunter escreveu:
Quoted 7 lines · Adrian Hunter
Quoted 6 lines
In cycle-accurate mode, timestamps can be calculated from CYC packets. The decoder also estimates timestamps based on the number of instructions since the last timestamp. For that to work in cycle-accurate mode, the instruction count needs to be reset to zero when a timestamp is calculated from a CYC packet, but that wasn't happening, so fix it.
Quoted 6 lines
Quoted 2 lines
Signed-off-by Adrian Hunter <[email protected]>Cc [email protected] # v4.3+Hi
These 2 patches are still outstanding when you have time.
Thanks for the reminder, applied.
Quoted 21 lines
Regards
AdrianQuoted 18 lines
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 2 ++ 1 file changed, 2 insertions(+)tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +2
-0@@ -1353,6 +1353,8 @@ static void intel_pt_calc_cyc_timestamp(struct intel_pt_decoder *decoder) timestamp, decoder->timestamp); else decoder->timestamp = timestamp; + + decoder->timestamp_insn_cnt =0 ; }/* Walk PSB+ packets when already in sync. */
tip-bot for Adrian Hunter
merge botperf intel-pt: Fix estimated timestamps for cycle-accurate mode
Commit-ID: 51ee6481fa8e879cc942bcc1b0af713e158b7a98 Gitweb: http://git.kernel.org/tip/51ee6481fa8e879cc942bcc1b0af713e158b7a98 Author: Adrian Hunter <[email protected]> AuthorDate: Wed, 28 Sep 2016 14:41:35 +0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 5 Oct 2016 08:15:29 -0300
perf intel-pt: Fix estimated timestamps for cycle-accurate mode
In cycle-accurate mode, timestamps can be calculated from CYC packets. The decoder also estimates timestamps based on the number of instructions since the last timestamp. For that to work in cycle-accurate mode, the instruction count needs to be reset to zero when a timestamp is calculated from a CYC packet, but that wasn't happening, so fix it.
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +2 -0
@@ -1353,6 +1353,8 @@ static void intel_pt_calc_cyc_timestamp(struct intel_pt_decoder *decoder) timestamp, decoder->timestamp); else decoder->timestamp = timestamp; + + decoder->timestamp_insn_cnt =0 ; }/* Walk PSB+ packets when already in sync. */