Add support for attributes in the -perfcounter argument
Five attributes are supported, matching what the perf(1) tool supports. The 'p' attribute (precise IP reporting) wasn't added because we don't do assembly-level debugging with benchlib. Change-Id: I726f735a5bcc0c97e62cde0fbe0843597068ad7c Reviewed-by: Jason McDonald <macadder1@gmail.com>bb10
parent
3963ab9d73
commit
408fa1e2b9
|
|
@ -53,6 +53,7 @@
|
|||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
|
@ -418,9 +419,11 @@ QTest::QBenchmarkMetric QBenchmarkPerfEventsMeasurer::metricForEvent(quint32 typ
|
|||
void QBenchmarkPerfEventsMeasurer::setCounter(const char *name)
|
||||
{
|
||||
initPerf();
|
||||
const char *colon = strchr(name, ':');
|
||||
int n = colon ? colon - name : strlen(name);
|
||||
const Events *ptr = eventlist;
|
||||
for ( ; ptr->type != PERF_TYPE_MAX; ++ptr) {
|
||||
int c = strcmp(name, eventlist_strings + ptr->offset);
|
||||
int c = strncmp(name, eventlist_strings + ptr->offset, n);
|
||||
if (c == 0)
|
||||
break;
|
||||
if (c < 0) {
|
||||
|
|
@ -431,6 +434,32 @@ void QBenchmarkPerfEventsMeasurer::setCounter(const char *name)
|
|||
|
||||
attr.type = ptr->type;
|
||||
attr.config = ptr->event_id;
|
||||
|
||||
// now parse the attributes
|
||||
if (!colon)
|
||||
return;
|
||||
while (*++colon) {
|
||||
switch (*colon) {
|
||||
case 'u':
|
||||
attr.exclude_user = true;
|
||||
break;
|
||||
case 'k':
|
||||
attr.exclude_kernel = true;
|
||||
break;
|
||||
case 'h':
|
||||
attr.exclude_hv = true;
|
||||
break;
|
||||
case 'G':
|
||||
attr.exclude_guest = true;
|
||||
break;
|
||||
case 'H':
|
||||
attr.exclude_host = true;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "ERROR: Unknown attribute '%c'\n", *colon);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QBenchmarkPerfEventsMeasurer::listCounters()
|
||||
|
|
@ -448,6 +477,14 @@ void QBenchmarkPerfEventsMeasurer::listCounters()
|
|||
ptr->type == PERF_TYPE_SOFTWARE ? "software" :
|
||||
ptr->type == PERF_TYPE_HW_CACHE ? "cache" : "other");
|
||||
}
|
||||
|
||||
printf("\nAttributes can be specified by adding a colon and the following:\n"
|
||||
" u - exclude measuring in the userspace\n"
|
||||
" k - exclude measuring in kernel mode\n"
|
||||
" h - exclude measuring in the hypervisor\n"
|
||||
" G - exclude measuring when running virtualized (guest VM)\n"
|
||||
" H - exclude measuring when running non-virtualized (host system)\n"
|
||||
"Attributes can be combined, for example: -perfcounter branch-mispredicts:kh\n");
|
||||
}
|
||||
|
||||
QBenchmarkPerfEventsMeasurer::QBenchmarkPerfEventsMeasurer()
|
||||
|
|
|
|||
Loading…
Reference in New Issue