misc: tegra-profiler: fix setup bug
Igor Nabirushkin [Fri, 16 May 2014 06:44:06 +0000 (10:44 +0400)]
* Fix bug that happens when using non-standard profiling frequencies
* Allow root user to use any frequency in range [100 Hz; 100 kHz]

Bug 200005366

Change-Id: I9a07e2c9c1fec6d61f34009d1975ea7f5d0e2592
Signed-off-by: Igor Nabirushkin <inabirushkin@nvidia.com>
Reviewed-on: http://git-master/r/410705
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Tested-by: Daniel Horowitz <dhorowitz@nvidia.com>
Tested-by: Maxim Morin <mmorin@nvidia.com>

drivers/misc/tegra-profiler/hrt.h
drivers/misc/tegra-profiler/main.c
drivers/misc/tegra-profiler/version.h

index f209dc1..ef1f673 100644 (file)
@@ -56,7 +56,7 @@ struct quadd_hrt_ctx {
        unsigned long rss_size_prev;
 };
 
-#define QUADD_HRT_MIN_FREQ     110
+#define QUADD_HRT_MIN_FREQ     100
 
 #define QUADD_U32_MAX (~(__u32)0)
 
index 35a44b1..487d984 100644 (file)
@@ -158,7 +158,17 @@ static inline int is_event_supported(struct source_info *si, int event)
        return 0;
 }
 
-static int set_parameters(struct quadd_parameters *p, uid_t *debug_app_uid)
+static int
+validate_freq(unsigned int freq)
+{
+       if (capable(CAP_SYS_ADMIN))
+               return freq >= 100 && freq <= 100000;
+       else
+               return freq == 100 || freq == 1000 || freq == 10000;
+}
+
+static int
+set_parameters(struct quadd_parameters *p, uid_t *debug_app_uid)
 {
        int i, err;
        int pmu_events_id[QUADD_MAX_COUNTERS];
@@ -168,9 +178,10 @@ static int set_parameters(struct quadd_parameters *p, uid_t *debug_app_uid)
        struct task_struct *task;
        unsigned int extra;
 
-       if (ctx.param.freq != 100 && ctx.param.freq != 1000 &&
-           ctx.param.freq != 10000)
+       if (!validate_freq(p->freq)) {
+               pr_err("%s: incorrect frequency: %u", __func__, p->freq);
                return -EINVAL;
+       }
 
        ctx.param.freq = p->freq;
        ctx.param.ma_freq = p->ma_freq;
@@ -284,6 +295,9 @@ static int set_parameters(struct quadd_parameters *p, uid_t *debug_app_uid)
        if (extra & QUADD_PARAM_EXTRA_BT_FP)
                pr_info("unwinding: frame pointers\n");
 
+       if (extra & QUADD_PARAM_EXTRA_BT_MIXED)
+               pr_info("unwinding: mixed mode\n");
+
        quadd_unwind_start(task);
 
        pr_info("New parameters have been applied\n");
index c58e38e..0dc8129 100644 (file)
@@ -18,7 +18,7 @@
 #ifndef __QUADD_VERSION_H
 #define __QUADD_VERSION_H
 
-#define QUADD_MODULE_VERSION           "1.66"
+#define QUADD_MODULE_VERSION           "1.67"
 #define QUADD_MODULE_BRANCH            "Dev"
 
 #endif /* __QUADD_VERSION_H */