perf script: Display new D (Intr Disabled) and t (Intr Toggle) flags
Amend the display to include D and t flags in the same way as the x flag. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Link: https://lore.kernel.org/r/20220124084201.2699795-21-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
a48b96ca5a
commit
2673859865
@@ -195,16 +195,19 @@ OPTIONS
|
|||||||
At this point usage is displayed, and perf-script exits.
|
At this point usage is displayed, and perf-script exits.
|
||||||
|
|
||||||
The flags field is synthesized and may have a value when Instruction
|
The flags field is synthesized and may have a value when Instruction
|
||||||
Trace decoding. The flags are "bcrosyiABExgh" which stand for branch,
|
Trace decoding. The flags are "bcrosyiABExghDt" which stand for branch,
|
||||||
call, return, conditional, system, asynchronous, interrupt,
|
call, return, conditional, system, asynchronous, interrupt,
|
||||||
transaction abort, trace begin, trace end, in transaction, VM-Entry, and VM-Exit
|
transaction abort, trace begin, trace end, in transaction, VM-Entry,
|
||||||
respectively. Known combinations of flags are printed more nicely e.g.
|
VM-Exit, interrupt disabled and interrupt disable toggle respectively.
|
||||||
|
Known combinations of flags are printed more nicely e.g.
|
||||||
"call" for "bc", "return" for "br", "jcc" for "bo", "jmp" for "b",
|
"call" for "bc", "return" for "br", "jcc" for "bo", "jmp" for "b",
|
||||||
"int" for "bci", "iret" for "bri", "syscall" for "bcs", "sysret" for "brs",
|
"int" for "bci", "iret" for "bri", "syscall" for "bcs", "sysret" for "brs",
|
||||||
"async" for "by", "hw int" for "bcyi", "tx abrt" for "bA", "tr strt" for "bB",
|
"async" for "by", "hw int" for "bcyi", "tx abrt" for "bA", "tr strt" for "bB",
|
||||||
"tr end" for "bE", "vmentry" for "bcg", "vmexit" for "bch".
|
"tr end" for "bE", "vmentry" for "bcg", "vmexit" for "bch".
|
||||||
However the "x" flag will be displayed separately in those
|
However the "x", "D" and "t" flags will be displayed separately in those
|
||||||
cases e.g. "jcc (x)" for a condition branch within a transaction.
|
cases e.g. "jcc (xD)" for a condition branch within a transaction
|
||||||
|
with interrupts disabled. Note, interrupts becoming disabled is "t",
|
||||||
|
whereas interrupts becoming enabled is "Dt".
|
||||||
|
|
||||||
The callindent field is synthesized and may have a value when
|
The callindent field is synthesized and may have a value when
|
||||||
Instruction Trace decoding. For calls and returns, it will display the
|
Instruction Trace decoding. For calls and returns, it will display the
|
||||||
|
|||||||
@@ -1579,26 +1579,34 @@ static const char *sample_flags_to_name(u32 flags)
|
|||||||
|
|
||||||
int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz)
|
int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz)
|
||||||
{
|
{
|
||||||
|
u32 xf = PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_INTR_DISABLE |
|
||||||
|
PERF_IP_FLAG_INTR_TOGGLE;
|
||||||
const char *chars = PERF_IP_FLAG_CHARS;
|
const char *chars = PERF_IP_FLAG_CHARS;
|
||||||
const size_t n = strlen(PERF_IP_FLAG_CHARS);
|
const size_t n = strlen(PERF_IP_FLAG_CHARS);
|
||||||
bool in_tx = flags & PERF_IP_FLAG_IN_TX;
|
|
||||||
const char *name = NULL;
|
const char *name = NULL;
|
||||||
size_t i, pos = 0;
|
size_t i, pos = 0;
|
||||||
|
char xs[16] = {0};
|
||||||
|
|
||||||
name = sample_flags_to_name(flags & ~PERF_IP_FLAG_IN_TX);
|
if (flags & xf)
|
||||||
|
snprintf(xs, sizeof(xs), "(%s%s%s)",
|
||||||
|
flags & PERF_IP_FLAG_IN_TX ? "x" : "",
|
||||||
|
flags & PERF_IP_FLAG_INTR_DISABLE ? "D" : "",
|
||||||
|
flags & PERF_IP_FLAG_INTR_TOGGLE ? "t" : "");
|
||||||
|
|
||||||
|
name = sample_flags_to_name(flags & ~xf);
|
||||||
if (name)
|
if (name)
|
||||||
return snprintf(str, sz, "%-15s%4s", name, in_tx ? "(x)" : "");
|
return snprintf(str, sz, "%-15s%6s", name, xs);
|
||||||
|
|
||||||
if (flags & PERF_IP_FLAG_TRACE_BEGIN) {
|
if (flags & PERF_IP_FLAG_TRACE_BEGIN) {
|
||||||
name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_BEGIN));
|
name = sample_flags_to_name(flags & ~(xf | PERF_IP_FLAG_TRACE_BEGIN));
|
||||||
if (name)
|
if (name)
|
||||||
return snprintf(str, sz, "tr strt %-7s%4s", name, in_tx ? "(x)" : "");
|
return snprintf(str, sz, "tr strt %-7s%6s", name, xs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & PERF_IP_FLAG_TRACE_END) {
|
if (flags & PERF_IP_FLAG_TRACE_END) {
|
||||||
name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_END));
|
name = sample_flags_to_name(flags & ~(xf | PERF_IP_FLAG_TRACE_END));
|
||||||
if (name)
|
if (name)
|
||||||
return snprintf(str, sz, "tr end %-7s%4s", name, in_tx ? "(x)" : "");
|
return snprintf(str, sz, "tr end %-7s%6s", name, xs);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < n; i++, flags >>= 1) {
|
for (i = 0; i < n; i++, flags >>= 1) {
|
||||||
@@ -1620,7 +1628,7 @@ static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
|
|||||||
char str[SAMPLE_FLAGS_BUF_SIZE];
|
char str[SAMPLE_FLAGS_BUF_SIZE];
|
||||||
|
|
||||||
perf_sample__sprintf_flags(flags, str, sizeof(str));
|
perf_sample__sprintf_flags(flags, str, sizeof(str));
|
||||||
return fprintf(fp, " %-19s ", str);
|
return fprintf(fp, " %-21s ", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct printer_data {
|
struct printer_data {
|
||||||
|
|||||||
Reference in New Issue
Block a user