misc: tegra-profiler: add task states
Igor Nabirushkin [Mon, 16 Mar 2015 14:08:36 +0000 (18:08 +0400)]
* Add task states into sched samples.
* Store task exit_state field.

Bug 1624099

Change-Id: I4a25aa6c15b59da987688342478127dccc5c0a1c
Signed-off-by: Igor Nabirushkin <inabirushkin@nvidia.com>
Reviewed-on: http://git-master/r/717839
Tested-by: Maxim Morin <mmorin@nvidia.com>
Reviewed-by: Dmitry Antipov <dantipov@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>

drivers/misc/tegra-profiler/hrt.c
drivers/misc/tegra-profiler/version.h
include/linux/tegra_profiler.h

index 7b99fb8..d587781 100644 (file)
@@ -51,6 +51,11 @@ struct hrt_event_value {
        u32 value;
 };
 
+static inline u32 get_task_state(struct task_struct *task)
+{
+       return (u32)(task->state | task->exit_state);
+}
+
 static enum hrtimer_restart hrtimer_handler(struct hrtimer *hrtimer)
 {
        struct pt_regs *regs;
@@ -231,8 +236,8 @@ put_sched_sample(struct task_struct *task, int is_sched_in)
 
        s->reserved = 0;
 
-       s->data[0] = 0;
-       s->data[1] = 0;
+       s->data[QUADD_SCHED_IDX_TASK_STATE] = get_task_state(task);
+       s->data[QUADD_SCHED_IDX_RESERVED] = 0;
 
        quadd_put_sample_this_cpu(&record, NULL, 0);
 }
@@ -354,6 +359,9 @@ read_all_sources(struct pt_regs *regs, struct task_struct *task)
        if (!task)
                task = current;
 
+       if (task_is_dead(task))
+               return;
+
        rcu_read_lock();
        if (!task_nsproxy(task)) {
                rcu_read_unlock();
@@ -458,7 +466,7 @@ read_all_sources(struct pt_regs *regs, struct task_struct *task)
        vec[vec_idx].len = nr_positive_events * sizeof(events_extra[0]);
        vec_idx++;
 
-       state = task->state;
+       state = get_task_state(task);
        if (state) {
                s->state = 1;
                vec[vec_idx].base = &state;
index bf4c275..f956c1d 100644 (file)
@@ -18,7 +18,7 @@
 #ifndef __QUADD_VERSION_H
 #define __QUADD_VERSION_H
 
-#define QUADD_MODULE_VERSION           "1.95"
+#define QUADD_MODULE_VERSION           "1.96"
 #define QUADD_MODULE_BRANCH            "Dev"
 
 #endif /* __QUADD_VERSION_H */
index f8042dc..66d5bf2 100644 (file)
@@ -19,7 +19,7 @@
 
 #include <linux/ioctl.h>
 
-#define QUADD_SAMPLES_VERSION  31
+#define QUADD_SAMPLES_VERSION  32
 #define QUADD_IO_VERSION       17
 
 #define QUADD_IO_VERSION_DYNAMIC_RB            5
@@ -49,6 +49,7 @@
 #define QUADD_SAMPLE_VERSION_HDR_UNW_METHOD    29
 #define QUADD_SAMPLE_VERSION_HDR_ARCH_TIMER    30
 #define QUADD_SAMPLE_VERSION_STACK_OFFSET      31
+#define QUADD_SAMPLE_VERSION_SCHED_TASK_STATE  32
 
 #define QUADD_MMAP_HEADER_VERSION              1
 
@@ -267,6 +268,11 @@ struct quadd_additional_sample {
        u16 extra_length;
 };
 
+enum {
+       QUADD_SCHED_IDX_TASK_STATE = 0,
+       QUADD_SCHED_IDX_RESERVED,
+};
+
 struct quadd_sched_data {
        u32 pid;
        u64 time;