]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
misc: tegra-profiler: unwinding: add auto mode
authorIgor Nabirushkin <inabirushkin@nvidia.com>
Mon, 3 Mar 2014 07:52:22 +0000 (11:52 +0400)
committerBharat Nihalani <bnihalani@nvidia.com>
Tue, 11 Mar 2014 12:56:30 +0000 (05:56 -0700)
Tegra Profiler: automatic selection of unwinding
method (frame pointers or exception-handling tables)

Bug 1465331

Change-Id: I8ae85e78b32198c685aab44102f919f33a2bad55
Signed-off-by: Igor Nabirushkin <inabirushkin@nvidia.com>
Reviewed-on: http://git-master/r/377071
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Tested-by: Maxim Morin <mmorin@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
drivers/misc/tegra-profiler/backtrace.c
drivers/misc/tegra-profiler/eh_unwind.c
drivers/misc/tegra-profiler/version.h

index 5c10aaea922408cf9a81971c82b0365ed8fd75f8..5da108498501ff591015c3ad957d3757e7f06df9 100644 (file)
@@ -95,6 +95,7 @@ get_user_callchain_fp(struct pt_regs *regs,
        struct mm_struct *mm = current->mm;
 
        cc->nr = 0;
+       cc->unw_method = QUADD_UNW_METHOD_FP;
 
        if (!regs || !mm)
                return 0;
@@ -168,7 +169,7 @@ quadd_get_user_callchain(struct pt_regs *regs,
                         struct quadd_callchain *cc,
                         struct quadd_ctx *ctx)
 {
-       int unw_fp, unw_eht;
+       int unw_fp, unw_eht, nr = 0;
        unsigned int extra;
        struct quadd_parameters *param = &ctx->param;
 
@@ -184,13 +185,11 @@ quadd_get_user_callchain(struct pt_regs *regs,
 
        cc->unw_rc = 0;
 
-       if (unw_fp) {
-               cc->unw_method = QUADD_UNW_METHOD_FP;
-               get_user_callchain_fp(regs, cc);
-       } else if (unw_eht) {
-               cc->unw_method = QUADD_UNW_METHOD_EHT;
-               quadd_get_user_callchain_ut(regs, cc);
-       }
+       if (unw_eht)
+               nr = quadd_get_user_callchain_ut(regs, cc);
 
-       return cc->nr;
+       if (!nr && unw_fp)
+               nr = get_user_callchain_fp(regs, cc);
+
+       return nr;
 }
index 9e411d6c767cba8c7a76012bb522c4860efb7a1d..0703f966e02533fdde62f6a6df22d8e532db3546 100644 (file)
@@ -831,6 +831,7 @@ quadd_get_user_callchain_ut(struct pt_regs *regs,
        struct ex_region_info *ri;
        struct extables tabs;
 
+       cc->unw_method = QUADD_UNW_METHOD_EHT;
        cc->unw_rc = QUADD_URC_FAILURE;
 
        if (!regs || !mm)
index 1ecb006c7f0fe5bae7415aef9ce077fa864a33d7..ff6da74ee040d0d87f941831d925e93bba616c54 100644 (file)
@@ -18,7 +18,7 @@
 #ifndef __QUADD_VERSION_H
 #define __QUADD_VERSION_H
 
-#define QUADD_MODULE_VERSION           "1.55"
+#define QUADD_MODULE_VERSION           "1.56"
 #define QUADD_MODULE_BRANCH            "Dev"
 
 #endif /* __QUADD_VERSION_H */