From 9b2b1641cb7000b6bac3b07369321effc2d76cd0 Mon Sep 17 00:00:00 2001 From: Igor Nabirushkin Date: Fri, 16 May 2014 10:44:06 +0400 Subject: [PATCH] misc: tegra-profiler: fix setup bug * 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 Reviewed-on: http://git-master/r/410705 (cherry picked from commit baa22c2e4e7b1f676fec2456907c8f8ce43c6c03) Reviewed-on: http://git-master/r/454443 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Tested-by: Maxim Morin Reviewed-by: Mitch Luban --- drivers/misc/tegra-profiler/hrt.h | 2 +- drivers/misc/tegra-profiler/main.c | 20 +++++++++++++++++--- drivers/misc/tegra-profiler/version.h | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/misc/tegra-profiler/hrt.h b/drivers/misc/tegra-profiler/hrt.h index f209dc11611..ef1f6738baa 100644 --- a/drivers/misc/tegra-profiler/hrt.h +++ b/drivers/misc/tegra-profiler/hrt.h @@ -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) diff --git a/drivers/misc/tegra-profiler/main.c b/drivers/misc/tegra-profiler/main.c index 35a44b11deb..487d984a1b1 100644 --- a/drivers/misc/tegra-profiler/main.c +++ b/drivers/misc/tegra-profiler/main.c @@ -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"); diff --git a/drivers/misc/tegra-profiler/version.h b/drivers/misc/tegra-profiler/version.h index c58e38eba03..0dc8129a6b5 100644 --- a/drivers/misc/tegra-profiler/version.h +++ b/drivers/misc/tegra-profiler/version.h @@ -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 */ -- 2.39.2