perf_counter: use misc field to widen type
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Wed, 8 Apr 2009 13:01:27 +0000 (15:01 +0200)
committerIngo Molnar <mingo@elte.hu>
Wed, 8 Apr 2009 16:53:28 +0000 (18:53 +0200)
Push the PERF_EVENT_COUNTER_OVERFLOW bit into the misc field so that
we can have the full 32bit for PERF_RECORD_ bits.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
LKML-Reference: <20090408130408.891867663@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
include/linux/perf_counter.h
kernel/perf_counter.c

index 5bd8817b12d4ac990dd7641eecbdc7d736246385..4809ae18a9401584311424fb27fd20de8ede6f5c 100644 (file)
@@ -201,8 +201,9 @@ struct perf_counter_mmap_page {
        __u32   data_head;              /* head in the data section */
 };
 
-#define PERF_EVENT_MISC_KERNEL (1 << 0)
-#define PERF_EVENT_MISC_USER   (1 << 1)
+#define PERF_EVENT_MISC_KERNEL         (1 << 0)
+#define PERF_EVENT_MISC_USER           (1 << 1)
+#define PERF_EVENT_MISC_OVERFLOW       (1 << 2)
 
 struct perf_event_header {
        __u32   type;
@@ -230,36 +231,27 @@ enum perf_event_type {
        PERF_EVENT_MUNMAP               = 2,
 
        /*
-        * Half the event type space is reserved for the counter overflow
-        * bitfields, as found in hw_event.record_type.
-        *
-        * These events will have types of the form:
-        *   PERF_EVENT_COUNTER_OVERFLOW { | __PERF_EVENT_* } *
+        * When header.misc & PERF_EVENT_MISC_OVERFLOW the event_type field
+        * will be PERF_RECORD_*
         *
         * struct {
         *      struct perf_event_header        header;
         *
-        *      { u64                   ip;       } && __PERF_EVENT_IP
-        *      { u32                   pid, tid; } && __PERF_EVENT_TID
+        *      { u64                   ip;       } && PERF_RECORD_IP
+        *      { u32                   pid, tid; } && PERF_RECORD_TID
         *
         *      { u64                   nr;
-        *        { u64 event, val; }   cnt[nr];  } && __PERF_EVENT_GROUP
+        *        { u64 event, val; }   cnt[nr];  } && PERF_RECORD_GROUP
         *
         *      { u16                   nr,
         *                              hv,
         *                              kernel,
         *                              user;
-        *        u64                   ips[nr];  } && __PERF_EVENT_CALLCHAIN
+        *        u64                   ips[nr];  } && PERF_RECORD_CALLCHAIN
         *
-        *      { u64                   time;     } && __PERF_EVENT_TIME
+        *      { u64                   time;     } && PERF_RECORD_TIME
         * };
         */
-       PERF_EVENT_COUNTER_OVERFLOW     = 1UL << 31,
-       __PERF_EVENT_IP                 = PERF_RECORD_IP,
-       __PERF_EVENT_TID                = PERF_RECORD_TID,
-       __PERF_EVENT_GROUP              = PERF_RECORD_GROUP,
-       __PERF_EVENT_CALLCHAIN          = PERF_RECORD_CALLCHAIN,
-       __PERF_EVENT_TIME               = PERF_RECORD_TIME,
 };
 
 #ifdef __KERNEL__
index 4af98f943d3b504ef5d44bd5fa58e17676e91e3c..bf12df6f3538c6b624a705f68b7b854ff7a4c123 100644 (file)
@@ -1828,15 +1828,16 @@ static void perf_counter_output(struct perf_counter *counter,
        int callchain_size = 0;
        u64 time;
 
-       header.type = PERF_EVENT_COUNTER_OVERFLOW;
+       header.type = 0;
        header.size = sizeof(header);
 
-       header.misc = user_mode(regs) ?
+       header.misc = PERF_EVENT_MISC_OVERFLOW;
+       header.misc |= user_mode(regs) ?
                PERF_EVENT_MISC_USER : PERF_EVENT_MISC_KERNEL;
 
        if (record_type & PERF_RECORD_IP) {
                ip = instruction_pointer(regs);
-               header.type |= __PERF_EVENT_IP;
+               header.type |= PERF_RECORD_IP;
                header.size += sizeof(ip);
        }
 
@@ -1845,12 +1846,12 @@ static void perf_counter_output(struct perf_counter *counter,
                tid_entry.pid = current->group_leader->pid;
                tid_entry.tid = current->pid;
 
-               header.type |= __PERF_EVENT_TID;
+               header.type |= PERF_RECORD_TID;
                header.size += sizeof(tid_entry);
        }
 
        if (record_type & PERF_RECORD_GROUP) {
-               header.type |= __PERF_EVENT_GROUP;
+               header.type |= PERF_RECORD_GROUP;
                header.size += sizeof(u64) +
                        counter->nr_siblings * sizeof(group_entry);
        }
@@ -1861,7 +1862,7 @@ static void perf_counter_output(struct perf_counter *counter,
                if (callchain) {
                        callchain_size = (1 + callchain->nr) * sizeof(u64);
 
-                       header.type |= __PERF_EVENT_CALLCHAIN;
+                       header.type |= PERF_RECORD_CALLCHAIN;
                        header.size += callchain_size;
                }
        }
@@ -1872,7 +1873,7 @@ static void perf_counter_output(struct perf_counter *counter,
                 */
                time = sched_clock();
 
-               header.type |= __PERF_EVENT_TIME;
+               header.type |= PERF_RECORD_TIME;
                header.size += sizeof(u64);
        }