]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
misc: tegra-profiler: fix hang up bug for Norrin
authorIgor Nabirushkin <inabirushkin@nvidia.com>
Mon, 19 May 2014 12:49:19 +0000 (16:49 +0400)
committerBharat Nihalani <bnihalani@nvidia.com>
Fri, 13 Jun 2014 07:57:20 +0000 (00:57 -0700)
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 <inabirushkin@nvidia.com>
Reviewed-on: http://git-master/r/411507
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
GVS: Gerrit_Virtual_Submit
Tested-by: Daniel Horowitz <dhorowitz@nvidia.com>
Tested-by: Maxim Morin <mmorin@nvidia.com>
drivers/misc/tegra-profiler/eh_unwind.c
drivers/misc/tegra-profiler/version.h

index d97edfb2c617f1c7e90470efb6604459cfe16aa2..c990b0c284bbce04ce696ebb23d00f8b3ad47c7f 100644 (file)
@@ -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
index 62a1b02ed00b4e444dbb9bb5730cd724fb2d40f3..779dc6b5ac4d0197428c9622efbeacb68010857b 100644 (file)
@@ -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 */