misc: tegra-profiler: rd_alloc
Shu Zhong [Tue, 1 Jul 2014 17:25:57 +0000 (10:25 -0700)]
quadd_unwind_start calls rd_alloc while holding a spinlock.
This is dangerous because rd_alloc allocates memory with
the GFP_KERNEL flag. This fix simply moves rd_alloc outside
the critical section.

Bug 1529894
Bug 1598009

Change-Id: I284e72d2fdd9089428d75f3c3efb79513a897b7e
Signed-off-by: Shu Zhong <shuz@nvidia.com>
Reviewed-on: http://git-master/r/433264
(cherry picked from commit e29a862f449b3f1831410162c4360041438017dc)
Reviewed-on: http://git-master/r/672012
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Igor Nabirushkin <inabirushkin@nvidia.com>
Tested-by: Igor Nabirushkin <inabirushkin@nvidia.com>
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>

drivers/misc/tegra-profiler/eh_unwind.c

index ae3b0d0..70ffebe 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * drivers/misc/tegra-profiler/exh_tables.c
  *
- * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2015, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -1125,6 +1125,7 @@ quadd_is_ex_entry_exist(struct pt_regs *regs,
 int quadd_unwind_start(struct task_struct *task)
 {
        struct regions_data *rd, *rd_old;
+       rd = rd_alloc(QUADD_EXTABS_SIZE);
 
        spin_lock(&ctx.lock);
 
@@ -1132,7 +1133,6 @@ int quadd_unwind_start(struct task_struct *task)
        if (rd_old)
                pr_warn("%s: warning: rd_old\n", __func__);
 
-       rd = rd_alloc(QUADD_EXTABS_SIZE);
        if (IS_ERR_OR_NULL(rd)) {
                pr_err("%s: error: rd_alloc\n", __func__);
                spin_unlock(&ctx.lock);