From 3f48f72f7b867db31edd087079c02c16b56251a7 Mon Sep 17 00:00:00 2001 From: Igor Nabirushkin Date: Mon, 19 May 2014 16:49:19 +0400 Subject: [PATCH] misc: tegra-profiler: fix hang up bug for Norrin Do not use probe_kernel_address. Actually, it is not safe on Norrin: this can lead to system crash. Bug 200005974 Bug 1522252 Change-Id: If8bae9afd7c7e1bbb5beaf430c0c61f552aeb036 Signed-off-by: Igor Nabirushkin Reviewed-on: http://git-master/r/411507 (cherry picked from commit 6c6b72dcf09a127d05082bab65b172a77bb56f45) Reviewed-on: http://git-master/r/454452 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Tested-by: Maxim Morin Reviewed-by: Mitch Luban --- drivers/misc/tegra-profiler/eh_unwind.c | 26 ++++++++++++++++++------- drivers/misc/tegra-profiler/version.h | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/drivers/misc/tegra-profiler/eh_unwind.c b/drivers/misc/tegra-profiler/eh_unwind.c index cc429c72c7b..714b6c01e26 100644 --- a/drivers/misc/tegra-profiler/eh_unwind.c +++ b/drivers/misc/tegra-profiler/eh_unwind.c @@ -152,13 +152,25 @@ validate_mmap_addr(struct quadd_extabs_mmap *mmap, return 1; } -#define read_user_data(addr, retval) \ -({ \ - long ret; \ - ret = probe_kernel_address(addr, retval); \ - if (ret) \ - ret = -QUADD_URC_EACCESS; \ - ret; \ +/* + * TBD: why probe_kernel_address() can lead to random crashes + * on 64-bit kernel, and replacing it to __get_user() fixed the issue. + */ +#define read_user_data(addr, retval) \ +({ \ + int ret; \ + \ + pagefault_disable(); \ + ret = __get_user(retval, addr); \ + pagefault_enable(); \ + \ + if (ret) { \ + pr_debug("%s: failed for address: %p\n", \ + __func__, addr); \ + ret = -QUADD_URC_EACCESS; \ + } \ + \ + ret; \ }) static inline long diff --git a/drivers/misc/tegra-profiler/version.h b/drivers/misc/tegra-profiler/version.h index 62a1b02ed00..779dc6b5ac4 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.70" +#define QUADD_MODULE_VERSION "1.71" #define QUADD_MODULE_BRANCH "Dev" #endif /* __QUADD_VERSION_H */ -- 2.39.2