These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / tools / perf / util / python.c
index d906d0a..98f127a 100644 (file)
@@ -67,6 +67,7 @@ static char pyrf_mmap_event__doc[] = PyDoc_STR("perf mmap event object.");
 static PyMemberDef pyrf_mmap_event__members[] = {
        sample_members
        member_def(perf_event_header, type, T_UINT, "event type"),
+       member_def(perf_event_header, misc, T_UINT, "event misc"),
        member_def(mmap_event, pid, T_UINT, "event pid"),
        member_def(mmap_event, tid, T_UINT, "event tid"),
        member_def(mmap_event, start, T_ULONGLONG, "start of the map"),
@@ -297,6 +298,43 @@ static PyTypeObject pyrf_sample_event__type = {
        .tp_repr        = (reprfunc)pyrf_sample_event__repr,
 };
 
+static char pyrf_context_switch_event__doc[] = PyDoc_STR("perf context_switch event object.");
+
+static PyMemberDef pyrf_context_switch_event__members[] = {
+       sample_members
+       member_def(perf_event_header, type, T_UINT, "event type"),
+       member_def(context_switch_event, next_prev_pid, T_UINT, "next/prev pid"),
+       member_def(context_switch_event, next_prev_tid, T_UINT, "next/prev tid"),
+       { .name = NULL, },
+};
+
+static PyObject *pyrf_context_switch_event__repr(struct pyrf_event *pevent)
+{
+       PyObject *ret;
+       char *s;
+
+       if (asprintf(&s, "{ type: context_switch, next_prev_pid: %u, next_prev_tid: %u, switch_out: %u }",
+                    pevent->event.context_switch.next_prev_pid,
+                    pevent->event.context_switch.next_prev_tid,
+                    !!(pevent->event.header.misc & PERF_RECORD_MISC_SWITCH_OUT)) < 0) {
+               ret = PyErr_NoMemory();
+       } else {
+               ret = PyString_FromString(s);
+               free(s);
+       }
+       return ret;
+}
+
+static PyTypeObject pyrf_context_switch_event__type = {
+       PyVarObject_HEAD_INIT(NULL, 0)
+       .tp_name        = "perf.context_switch_event",
+       .tp_basicsize   = sizeof(struct pyrf_event),
+       .tp_flags       = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
+       .tp_doc         = pyrf_context_switch_event__doc,
+       .tp_members     = pyrf_context_switch_event__members,
+       .tp_repr        = (reprfunc)pyrf_context_switch_event__repr,
+};
+
 static int pyrf_event__setup_types(void)
 {
        int err;
@@ -306,6 +344,7 @@ static int pyrf_event__setup_types(void)
        pyrf_lost_event__type.tp_new =
        pyrf_read_event__type.tp_new =
        pyrf_sample_event__type.tp_new =
+       pyrf_context_switch_event__type.tp_new =
        pyrf_throttle_event__type.tp_new = PyType_GenericNew;
        err = PyType_Ready(&pyrf_mmap_event__type);
        if (err < 0)
@@ -328,6 +367,9 @@ static int pyrf_event__setup_types(void)
        err = PyType_Ready(&pyrf_sample_event__type);
        if (err < 0)
                goto out;
+       err = PyType_Ready(&pyrf_context_switch_event__type);
+       if (err < 0)
+               goto out;
 out:
        return err;
 }
@@ -342,6 +384,8 @@ static PyTypeObject *pyrf_event__type[] = {
        [PERF_RECORD_FORK]       = &pyrf_task_event__type,
        [PERF_RECORD_READ]       = &pyrf_read_event__type,
        [PERF_RECORD_SAMPLE]     = &pyrf_sample_event__type,
+       [PERF_RECORD_SWITCH]     = &pyrf_context_switch_event__type,
+       [PERF_RECORD_SWITCH_CPU_WIDE]  = &pyrf_context_switch_event__type,
 };
 
 static PyObject *pyrf_event__new(union perf_event *event)
@@ -349,8 +393,10 @@ static PyObject *pyrf_event__new(union perf_event *event)
        struct pyrf_event *pevent;
        PyTypeObject *ptype;
 
-       if (event->header.type < PERF_RECORD_MMAP ||
-           event->header.type > PERF_RECORD_SAMPLE)
+       if ((event->header.type < PERF_RECORD_MMAP ||
+            event->header.type > PERF_RECORD_SAMPLE) &&
+           !(event->header.type == PERF_RECORD_SWITCH ||
+             event->header.type == PERF_RECORD_SWITCH_CPU_WIDE))
                return NULL;
 
        ptype = pyrf_event__type[event->header.type];
@@ -384,7 +430,7 @@ static int pyrf_cpu_map__init(struct pyrf_cpu_map *pcpus,
 
 static void pyrf_cpu_map__delete(struct pyrf_cpu_map *pcpus)
 {
-       cpu_map__delete(pcpus->cpus);
+       cpu_map__put(pcpus->cpus);
        pcpus->ob_type->tp_free((PyObject*)pcpus);
 }
 
@@ -453,7 +499,7 @@ static int pyrf_thread_map__init(struct pyrf_thread_map *pthreads,
 
 static void pyrf_thread_map__delete(struct pyrf_thread_map *pthreads)
 {
-       thread_map__delete(pthreads->threads);
+       thread_map__put(pthreads->threads);
        pthreads->ob_type->tp_free((PyObject*)pthreads);
 }
 
@@ -528,6 +574,7 @@ static int pyrf_evsel__init(struct pyrf_evsel *pevsel,
                "exclude_hv",
                "exclude_idle",
                "mmap",
+               "context_switch",
                "comm",
                "freq",
                "inherit_stat",
@@ -553,6 +600,7 @@ static int pyrf_evsel__init(struct pyrf_evsel *pevsel,
            exclude_hv = 0,
            exclude_idle = 0,
            mmap = 0,
+           context_switch = 0,
            comm = 0,
            freq = 1,
            inherit_stat = 0,
@@ -565,13 +613,13 @@ static int pyrf_evsel__init(struct pyrf_evsel *pevsel,
        int idx = 0;
 
        if (!PyArg_ParseTupleAndKeywords(args, kwargs,
-                                        "|iKiKKiiiiiiiiiiiiiiiiiiiiiKK", kwlist,
+                                        "|iKiKKiiiiiiiiiiiiiiiiiiiiiiKK", kwlist,
                                         &attr.type, &attr.config, &attr.sample_freq,
                                         &sample_period, &attr.sample_type,
                                         &attr.read_format, &disabled, &inherit,
                                         &pinned, &exclusive, &exclude_user,
                                         &exclude_kernel, &exclude_hv, &exclude_idle,
-                                        &mmap, &comm, &freq, &inherit_stat,
+                                        &mmap, &context_switch, &comm, &freq, &inherit_stat,
                                         &enable_on_exec, &task, &watermark,
                                         &precise_ip, &mmap_data, &sample_id_all,
                                         &attr.wakeup_events, &attr.bp_type,
@@ -595,6 +643,7 @@ static int pyrf_evsel__init(struct pyrf_evsel *pevsel,
        attr.exclude_hv     = exclude_hv;
        attr.exclude_idle   = exclude_idle;
        attr.mmap           = mmap;
+       attr.context_switch = context_switch;
        attr.comm           = comm;
        attr.freq           = freq;
        attr.inherit_stat   = inherit_stat;
@@ -941,76 +990,86 @@ static int pyrf_evlist__setup_types(void)
        return PyType_Ready(&pyrf_evlist__type);
 }
 
+#define PERF_CONST(name) { #name, PERF_##name }
+
 static struct {
        const char *name;
        int         value;
 } perf__constants[] = {
-       { "TYPE_HARDWARE",   PERF_TYPE_HARDWARE },
-       { "TYPE_SOFTWARE",   PERF_TYPE_SOFTWARE },
-       { "TYPE_TRACEPOINT", PERF_TYPE_TRACEPOINT },
-       { "TYPE_HW_CACHE",   PERF_TYPE_HW_CACHE },
-       { "TYPE_RAW",        PERF_TYPE_RAW },
-       { "TYPE_BREAKPOINT", PERF_TYPE_BREAKPOINT },
-
-       { "COUNT_HW_CPU_CYCLES",          PERF_COUNT_HW_CPU_CYCLES },
-       { "COUNT_HW_INSTRUCTIONS",        PERF_COUNT_HW_INSTRUCTIONS },
-       { "COUNT_HW_CACHE_REFERENCES",    PERF_COUNT_HW_CACHE_REFERENCES },
-       { "COUNT_HW_CACHE_MISSES",        PERF_COUNT_HW_CACHE_MISSES },
-       { "COUNT_HW_BRANCH_INSTRUCTIONS", PERF_COUNT_HW_BRANCH_INSTRUCTIONS },
-       { "COUNT_HW_BRANCH_MISSES",       PERF_COUNT_HW_BRANCH_MISSES },
-       { "COUNT_HW_BUS_CYCLES",          PERF_COUNT_HW_BUS_CYCLES },
-       { "COUNT_HW_CACHE_L1D",           PERF_COUNT_HW_CACHE_L1D },
-       { "COUNT_HW_CACHE_L1I",           PERF_COUNT_HW_CACHE_L1I },
-       { "COUNT_HW_CACHE_LL",            PERF_COUNT_HW_CACHE_LL },
-       { "COUNT_HW_CACHE_DTLB",          PERF_COUNT_HW_CACHE_DTLB },
-       { "COUNT_HW_CACHE_ITLB",          PERF_COUNT_HW_CACHE_ITLB },
-       { "COUNT_HW_CACHE_BPU",           PERF_COUNT_HW_CACHE_BPU },
-       { "COUNT_HW_CACHE_OP_READ",       PERF_COUNT_HW_CACHE_OP_READ },
-       { "COUNT_HW_CACHE_OP_WRITE",      PERF_COUNT_HW_CACHE_OP_WRITE },
-       { "COUNT_HW_CACHE_OP_PREFETCH",   PERF_COUNT_HW_CACHE_OP_PREFETCH },
-       { "COUNT_HW_CACHE_RESULT_ACCESS", PERF_COUNT_HW_CACHE_RESULT_ACCESS },
-       { "COUNT_HW_CACHE_RESULT_MISS",   PERF_COUNT_HW_CACHE_RESULT_MISS },
-
-       { "COUNT_HW_STALLED_CYCLES_FRONTEND",     PERF_COUNT_HW_STALLED_CYCLES_FRONTEND },
-       { "COUNT_HW_STALLED_CYCLES_BACKEND",      PERF_COUNT_HW_STALLED_CYCLES_BACKEND },
-
-       { "COUNT_SW_CPU_CLOCK",        PERF_COUNT_SW_CPU_CLOCK },
-       { "COUNT_SW_TASK_CLOCK",       PERF_COUNT_SW_TASK_CLOCK },
-       { "COUNT_SW_PAGE_FAULTS",      PERF_COUNT_SW_PAGE_FAULTS },
-       { "COUNT_SW_CONTEXT_SWITCHES", PERF_COUNT_SW_CONTEXT_SWITCHES },
-       { "COUNT_SW_CPU_MIGRATIONS",   PERF_COUNT_SW_CPU_MIGRATIONS },
-       { "COUNT_SW_PAGE_FAULTS_MIN",  PERF_COUNT_SW_PAGE_FAULTS_MIN },
-       { "COUNT_SW_PAGE_FAULTS_MAJ",  PERF_COUNT_SW_PAGE_FAULTS_MAJ },
-       { "COUNT_SW_ALIGNMENT_FAULTS", PERF_COUNT_SW_ALIGNMENT_FAULTS },
-       { "COUNT_SW_EMULATION_FAULTS", PERF_COUNT_SW_EMULATION_FAULTS },
-       { "COUNT_SW_DUMMY",            PERF_COUNT_SW_DUMMY },
-
-       { "SAMPLE_IP",        PERF_SAMPLE_IP },
-       { "SAMPLE_TID",       PERF_SAMPLE_TID },
-       { "SAMPLE_TIME",      PERF_SAMPLE_TIME },
-       { "SAMPLE_ADDR",      PERF_SAMPLE_ADDR },
-       { "SAMPLE_READ",      PERF_SAMPLE_READ },
-       { "SAMPLE_CALLCHAIN", PERF_SAMPLE_CALLCHAIN },
-       { "SAMPLE_ID",        PERF_SAMPLE_ID },
-       { "SAMPLE_CPU",       PERF_SAMPLE_CPU },
-       { "SAMPLE_PERIOD",    PERF_SAMPLE_PERIOD },
-       { "SAMPLE_STREAM_ID", PERF_SAMPLE_STREAM_ID },
-       { "SAMPLE_RAW",       PERF_SAMPLE_RAW },
-
-       { "FORMAT_TOTAL_TIME_ENABLED", PERF_FORMAT_TOTAL_TIME_ENABLED },
-       { "FORMAT_TOTAL_TIME_RUNNING", PERF_FORMAT_TOTAL_TIME_RUNNING },
-       { "FORMAT_ID",                 PERF_FORMAT_ID },
-       { "FORMAT_GROUP",              PERF_FORMAT_GROUP },
-
-       { "RECORD_MMAP",       PERF_RECORD_MMAP },
-       { "RECORD_LOST",       PERF_RECORD_LOST },
-       { "RECORD_COMM",       PERF_RECORD_COMM },
-       { "RECORD_EXIT",       PERF_RECORD_EXIT },
-       { "RECORD_THROTTLE",   PERF_RECORD_THROTTLE },
-       { "RECORD_UNTHROTTLE", PERF_RECORD_UNTHROTTLE },
-       { "RECORD_FORK",       PERF_RECORD_FORK },
-       { "RECORD_READ",       PERF_RECORD_READ },
-       { "RECORD_SAMPLE",     PERF_RECORD_SAMPLE },
+       PERF_CONST(TYPE_HARDWARE),
+       PERF_CONST(TYPE_SOFTWARE),
+       PERF_CONST(TYPE_TRACEPOINT),
+       PERF_CONST(TYPE_HW_CACHE),
+       PERF_CONST(TYPE_RAW),
+       PERF_CONST(TYPE_BREAKPOINT),
+
+       PERF_CONST(COUNT_HW_CPU_CYCLES),
+       PERF_CONST(COUNT_HW_INSTRUCTIONS),
+       PERF_CONST(COUNT_HW_CACHE_REFERENCES),
+       PERF_CONST(COUNT_HW_CACHE_MISSES),
+       PERF_CONST(COUNT_HW_BRANCH_INSTRUCTIONS),
+       PERF_CONST(COUNT_HW_BRANCH_MISSES),
+       PERF_CONST(COUNT_HW_BUS_CYCLES),
+       PERF_CONST(COUNT_HW_CACHE_L1D),
+       PERF_CONST(COUNT_HW_CACHE_L1I),
+       PERF_CONST(COUNT_HW_CACHE_LL),
+       PERF_CONST(COUNT_HW_CACHE_DTLB),
+       PERF_CONST(COUNT_HW_CACHE_ITLB),
+       PERF_CONST(COUNT_HW_CACHE_BPU),
+       PERF_CONST(COUNT_HW_CACHE_OP_READ),
+       PERF_CONST(COUNT_HW_CACHE_OP_WRITE),
+       PERF_CONST(COUNT_HW_CACHE_OP_PREFETCH),
+       PERF_CONST(COUNT_HW_CACHE_RESULT_ACCESS),
+       PERF_CONST(COUNT_HW_CACHE_RESULT_MISS),
+
+       PERF_CONST(COUNT_HW_STALLED_CYCLES_FRONTEND),
+       PERF_CONST(COUNT_HW_STALLED_CYCLES_BACKEND),
+
+       PERF_CONST(COUNT_SW_CPU_CLOCK),
+       PERF_CONST(COUNT_SW_TASK_CLOCK),
+       PERF_CONST(COUNT_SW_PAGE_FAULTS),
+       PERF_CONST(COUNT_SW_CONTEXT_SWITCHES),
+       PERF_CONST(COUNT_SW_CPU_MIGRATIONS),
+       PERF_CONST(COUNT_SW_PAGE_FAULTS_MIN),
+       PERF_CONST(COUNT_SW_PAGE_FAULTS_MAJ),
+       PERF_CONST(COUNT_SW_ALIGNMENT_FAULTS),
+       PERF_CONST(COUNT_SW_EMULATION_FAULTS),
+       PERF_CONST(COUNT_SW_DUMMY),
+
+       PERF_CONST(SAMPLE_IP),
+       PERF_CONST(SAMPLE_TID),
+       PERF_CONST(SAMPLE_TIME),
+       PERF_CONST(SAMPLE_ADDR),
+       PERF_CONST(SAMPLE_READ),
+       PERF_CONST(SAMPLE_CALLCHAIN),
+       PERF_CONST(SAMPLE_ID),
+       PERF_CONST(SAMPLE_CPU),
+       PERF_CONST(SAMPLE_PERIOD),
+       PERF_CONST(SAMPLE_STREAM_ID),
+       PERF_CONST(SAMPLE_RAW),
+
+       PERF_CONST(FORMAT_TOTAL_TIME_ENABLED),
+       PERF_CONST(FORMAT_TOTAL_TIME_RUNNING),
+       PERF_CONST(FORMAT_ID),
+       PERF_CONST(FORMAT_GROUP),
+
+       PERF_CONST(RECORD_MMAP),
+       PERF_CONST(RECORD_LOST),
+       PERF_CONST(RECORD_COMM),
+       PERF_CONST(RECORD_EXIT),
+       PERF_CONST(RECORD_THROTTLE),
+       PERF_CONST(RECORD_UNTHROTTLE),
+       PERF_CONST(RECORD_FORK),
+       PERF_CONST(RECORD_READ),
+       PERF_CONST(RECORD_SAMPLE),
+       PERF_CONST(RECORD_MMAP2),
+       PERF_CONST(RECORD_AUX),
+       PERF_CONST(RECORD_ITRACE_START),
+       PERF_CONST(RECORD_LOST_SAMPLES),
+       PERF_CONST(RECORD_SWITCH),
+       PERF_CONST(RECORD_SWITCH_CPU_WIDE),
+
+       PERF_CONST(RECORD_MISC_SWITCH_OUT),
        { .name = NULL, },
 };