perf: Add PERF_EVENT_IOC_ID ioctl to return event ID
authorJiri Olsa <jolsa@redhat.com>
Wed, 24 Oct 2012 11:37:58 +0000 (13:37 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 7 Aug 2013 20:35:19 +0000 (17:35 -0300)
The only way to get the event ID is by reading the event fd,
followed by parsing the ID value out of the returned data.

While this is ok for current read format used by perf tool,
it is not ok when we use PERF_FORMAT_GROUP format.

With this format the data are returned for the whole group
and there's no way to find out what ID belongs to our fd
(if we are not group leader event).

Adding a simple ioctl that returns event primary ID for given fd.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/n/tip-v1bn5cto707jn0bon34afqr1@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
include/uapi/linux/perf_event.h
kernel/events/core.c

index efef1d37a37188808fc66bc0533264193caa2189..62c25a25291cfdb2d2e5cf18641566ba4e8e5b0b 100644 (file)
@@ -321,6 +321,7 @@ struct perf_event_attr {
 #define PERF_EVENT_IOC_PERIOD          _IOW('$', 4, __u64)
 #define PERF_EVENT_IOC_SET_OUTPUT      _IO ('$', 5)
 #define PERF_EVENT_IOC_SET_FILTER      _IOW('$', 6, char *)
+#define PERF_EVENT_IOC_ID              _IOR('$', 7, u64 *)
 
 enum perf_event_ioc_flags {
        PERF_IOC_FLAG_GROUP             = 1U << 0,
index 916cf1f593b41968df88f40345d13a17a4b70354..5200b608b4818a7a80887a5127dc276b96200ce0 100644 (file)
@@ -3568,6 +3568,15 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        case PERF_EVENT_IOC_PERIOD:
                return perf_event_period(event, (u64 __user *)arg);
 
+       case PERF_EVENT_IOC_ID:
+       {
+               u64 id = primary_event_id(event);
+
+               if (copy_to_user((void __user *)arg, &id, sizeof(id)))
+                       return -EFAULT;
+               return 0;
+       }
+
        case PERF_EVENT_IOC_SET_OUTPUT:
        {
                int ret;