Fix signal handling to use store/restore instead of block/unblock as that may cause IRQ reentrancy
Signed-off-by: Anton Ivanov <aiva...@brocade.com> --- arch/um/os-Linux/skas/process.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 13c5a2c..5916267 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -313,6 +313,7 @@ void userspace(struct uml_pt_regs *regs) int err, status, op, pid = userspace_pid[0]; /* To prevent races if using_sysemu changes under us.*/ int local_using_sysemu; + unsigned long flags; siginfo_t si; /* Handle any immediate reschedules or signals */ @@ -396,9 +397,9 @@ void userspace(struct uml_pt_regs *regs) case SIGBUS: case SIGFPE: case SIGWINCH: - block_signals(); + flags = set_signals(0); (*sig_info[sig])(sig, (struct siginfo *)&si, regs); - unblock_signals(); + set_signals(flags); break; default: printk(UM_KERN_ERR "userspace - child stopped " @@ -586,15 +587,16 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf) void initial_thread_cb_skas(void (*proc)(void *), void *arg) { jmp_buf here; + unsigned long int flags; cb_proc = proc; cb_arg = arg; cb_back = &here; - block_signals(); + flags = set_signals(0); if (UML_SETJMP(&here) == 0) UML_LONGJMP(&initial_jmpbuf, INIT_JMP_CALLBACK); - unblock_signals(); + set_signals(flags); cb_proc = NULL; cb_arg = NULL; -- 2.1.4 ------------------------------------------------------------------------------ _______________________________________________ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel