]> git.baikalelectronics.ru Git - kernel.git/commitdiff
kdb: Make memory allocations more robust
authorSumit Garg <sumit.garg@linaro.org>
Fri, 22 Jan 2021 11:05:56 +0000 (16:35 +0530)
committerDaniel Thompson <daniel.thompson@linaro.org>
Mon, 8 Feb 2021 13:42:50 +0000 (13:42 +0000)
Currently kdb uses in_interrupt() to determine whether its library
code has been called from the kgdb trap handler or from a saner calling
context such as driver init. This approach is broken because
in_interrupt() alone isn't able to determine kgdb trap handler entry from
normal task context. This can happen during normal use of basic features
such as breakpoints and can also be trivially reproduced using:
echo g > /proc/sysrq-trigger

We can improve this by adding check for in_dbg_master() instead which
explicitly determines if we are running in debugger context.

Cc: stable@vger.kernel.org
Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
Link: https://lore.kernel.org/r/1611313556-4004-1-git-send-email-sumit.garg@linaro.org
Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
kernel/debug/kdb/kdb_private.h

index 0a56d35f6eea24e2979aca48025521cb1fa3d63e..6cb92f7bbbd0c87a6a6f88bacce492a739d75a6f 100644 (file)
@@ -230,7 +230,7 @@ extern struct task_struct *kdb_curr_task(int);
 
 #define kdb_task_has_cpu(p) (task_curr(p))
 
-#define GFP_KDB (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL)
+#define GFP_KDB (in_dbg_master() ? GFP_ATOMIC : GFP_KERNEL)
 
 extern void *debug_kmalloc(size_t size, gfp_t flags);
 extern void debug_kfree(void *);