|
@@ -3684,26 +3684,25 @@ void __init signals_init(void)
|
|
|
#ifdef CONFIG_KGDB_KDB
|
|
|
#include <linux/kdb.h>
|
|
|
/*
|
|
|
- * kdb_send_sig_info - Allows kdb to send signals without exposing
|
|
|
+ * kdb_send_sig - Allows kdb to send signals without exposing
|
|
|
* signal internals. This function checks if the required locks are
|
|
|
* available before calling the main signal code, to avoid kdb
|
|
|
* deadlocks.
|
|
|
*/
|
|
|
-void
|
|
|
-kdb_send_sig_info(struct task_struct *t, struct siginfo *info)
|
|
|
+void kdb_send_sig(struct task_struct *t, int sig)
|
|
|
{
|
|
|
static struct task_struct *kdb_prev_t;
|
|
|
- int sig, new_t;
|
|
|
+ int new_t, ret;
|
|
|
if (!spin_trylock(&t->sighand->siglock)) {
|
|
|
kdb_printf("Can't do kill command now.\n"
|
|
|
"The sigmask lock is held somewhere else in "
|
|
|
"kernel, try again later\n");
|
|
|
return;
|
|
|
}
|
|
|
- spin_unlock(&t->sighand->siglock);
|
|
|
new_t = kdb_prev_t != t;
|
|
|
kdb_prev_t = t;
|
|
|
if (t->state != TASK_RUNNING && new_t) {
|
|
|
+ spin_unlock(&t->sighand->siglock);
|
|
|
kdb_printf("Process is not RUNNING, sending a signal from "
|
|
|
"kdb risks deadlock\n"
|
|
|
"on the run queue locks. "
|
|
@@ -3712,8 +3711,9 @@ kdb_send_sig_info(struct task_struct *t, struct siginfo *info)
|
|
|
"the deadlock.\n");
|
|
|
return;
|
|
|
}
|
|
|
- sig = info->si_signo;
|
|
|
- if (send_sig_info(sig, info, t))
|
|
|
+ ret = send_signal(sig, SEND_SIG_PRIV, t, false);
|
|
|
+ spin_unlock(&t->sighand->siglock);
|
|
|
+ if (ret)
|
|
|
kdb_printf("Fail to deliver Signal %d to process %d.\n",
|
|
|
sig, t->pid);
|
|
|
else
|