Update perf_event_open support to add new features from the recent Linux 
3.16 release.

Signed-off-by: Vince Weaver <vincent.wea...@maine.edu>

diff --git a/include/perf_event.h b/include/perf_event.h
index 98d2ab5..9269de2 100644
--- a/include/perf_event.h
+++ b/include/perf_event.h
@@ -162,8 +163,9 @@ enum perf_branch_sample_type {
        PERF_SAMPLE_BRANCH_ABORT_TX     = 1U << 7, /* transaction aborts */
        PERF_SAMPLE_BRANCH_IN_TX        = 1U << 8, /* in transaction */
        PERF_SAMPLE_BRANCH_NO_TX        = 1U << 9, /* not in transaction */
+       PERF_SAMPLE_BRANCH_COND         = 1U << 10, /* conditional branches */
 
-       PERF_SAMPLE_BRANCH_MAX          = 1U << 10, /* non-ABI */
+       PERF_SAMPLE_BRANCH_MAX          = 1U << 11, /* non-ABI */
 };
 
 #define PERF_SAMPLE_BRANCH_PLM_ALL \
@@ -300,8 +302,8 @@ struct perf_event_attr {
                                exclude_callchain_kernel : 1, /* exclude kernel 
callchains */
                                exclude_callchain_user   : 1, /* exclude user 
callchains */
                                mmap2          :  1, /* include mmap with inode 
data     */
-
-                               __reserved_1   : 40;
+                               comm_exec      :  1, /* flag comm events that 
are due to an exec */
+                               __reserved_1   : 39;
 
        union {
                __u32           wakeup_events;    /* wakeup every n events */
@@ -500,7 +502,12 @@ struct perf_event_mmap_page {
 #define PERF_RECORD_MISC_GUEST_KERNEL          (4 << 0)
 #define PERF_RECORD_MISC_GUEST_USER            (5 << 0)
 
+/*
+ * PERF_RECORD_MISC_MMAP_DATA and PERF_RECORD_MISC_COMM_EXEC are used on
+ * different events so can reuse the same bit position.
+ */
 #define PERF_RECORD_MISC_MMAP_DATA             (1 << 13)
+#define PERF_RECORD_MISC_COMM_EXEC             (1 << 13)
 /*
  * Indicates that the content of PERF_SAMPLE_IP points to
  * the actual instruction that triggered the event. See also
@@ -698,6 +705,7 @@ enum perf_event_type {
         *      u32                             min;
         *      u64                             ino;
         *      u64                             ino_generation;
+        *      u32                             prot, flags;
         *      char                            filename[];
         *      struct sample_id                sample_id;
         * };
@@ -721,10 +729,10 @@ enum perf_callchain_context {
        PERF_CONTEXT_MAX                = (__u64)-4095,
 };
 
-#define PERF_FLAG_FD_NO_GROUP          (1U << 0)
-#define PERF_FLAG_FD_OUTPUT            (1U << 1)
-#define PERF_FLAG_PID_CGROUP           (1U << 2) /* pid=cgroup id, per-cpu 
mode only */
-#define PERF_FLAG_FD_CLOEXEC           (1U << 3) /* O_CLOEXEC */
+#define PERF_FLAG_FD_NO_GROUP          (1UL << 0)
+#define PERF_FLAG_FD_OUTPUT            (1UL << 1)
+#define PERF_FLAG_PID_CGROUP           (1UL << 2) /* pid=cgroup id, per-cpu 
mode only */
+#define PERF_FLAG_FD_CLOEXEC           (1UL << 3) /* O_CLOEXEC */
 
 union perf_mem_data_src {
        __u64 val;
@@ -812,3 +820,5 @@ struct perf_branch_entry {
                abort:1,    /* transaction abort */
                reserved:60;
 };
+
+#endif /* _UAPI_LINUX_PERF_EVENT_H */
diff --git a/syscalls/perf_event_open.c b/syscalls/perf_event_open.c
index 1ac959d..6dba16f 100644
--- a/syscalls/perf_event_open.c
+++ b/syscalls/perf_event_open.c
@@ -945,6 +945,8 @@ static long long random_branch_sample_type(void)
                branch_sample |= PERF_SAMPLE_BRANCH_ANY_RETURN;
        if (rand_bool())
                branch_sample |= PERF_SAMPLE_BRANCH_IND_CALL;
+       if (rand_bool())
+               branch_sample |= PERF_SAMPLE_BRANCH_COND;
 
        /* Transactional Memory Types */
        if (rand_bool())
@@ -998,6 +1000,8 @@ static void create_mostly_valid_counting_event(struct 
perf_event_attr *attr,
        attr->exclude_guest = rand_bool();
        attr->exclude_callchain_kernel = rand_bool();
        attr->exclude_callchain_user = rand_bool();
+       attr->mmap2 = rand_bool();
+       attr->comm_exec = rand_bool();
 
        /* wakeup events not relevant */
 
@@ -1059,6 +1063,8 @@ static void create_mostly_valid_sampling_event(struct 
perf_event_attr *attr,
        attr->exclude_guest = rand_bool();
        attr->exclude_callchain_kernel = rand_bool();
        attr->exclude_callchain_user = rand_bool();
+       attr->mmap2 = rand_bool();
+       attr->comm_exec = rand_bool();
 
        attr->wakeup_events = rand32();
 
@@ -1161,6 +1167,8 @@ static void create_random_event(struct perf_event_attr 
*attr)
        attr->exclude_guest = rand_bool();
        attr->exclude_callchain_kernel = rand_bool();
        attr->exclude_callchain_user = rand_bool();
+       attr->mmap2 = rand_bool();
+       attr->comm_exec = rand_bool();
 
        attr->wakeup_events=rand32();
 
--
To unsubscribe from this list: send the line "unsubscribe trinity" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to