remote_flush_tlb_cpumask() dead locking

refs #728
This commit is contained in:
Tomoki Shirasawa
2016-05-10 14:02:25 +09:00
parent 130b1f4327
commit 9b35eaca42
2 changed files with 24 additions and 9 deletions

View File

@ -898,8 +898,11 @@ void handle_interrupt(int vector, struct x86_user_context *regs)
} }
} }
if(interrupt_from_user(regs)){
cpu_enable_interrupt();
check_signal(0, regs, 0); check_signal(0, regs, 0);
check_need_resched(); check_need_resched();
}
set_cputime(0); set_cputime(0);
--v->in_interrupt; --v->in_interrupt;
@ -915,8 +918,11 @@ void gpe_handler(struct x86_user_context *regs)
panic("gpe_handler"); panic("gpe_handler");
} }
set_signal(SIGSEGV, regs, NULL); set_signal(SIGSEGV, regs, NULL);
if(interrupt_from_user(regs)){
cpu_enable_interrupt();
check_signal(0, regs, 0); check_signal(0, regs, 0);
check_need_resched(); check_need_resched();
}
set_cputime(0); set_cputime(0);
// panic("GPF"); // panic("GPF");
} }
@ -945,8 +951,11 @@ void debug_handler(struct x86_user_context *regs)
memset(&info, '\0', sizeof info); memset(&info, '\0', sizeof info);
info.si_code = si_code; info.si_code = si_code;
set_signal(SIGTRAP, regs, &info); set_signal(SIGTRAP, regs, &info);
if(interrupt_from_user(regs)){
cpu_enable_interrupt();
check_signal(0, regs, 0); check_signal(0, regs, 0);
check_need_resched(); check_need_resched();
}
set_cputime(0); set_cputime(0);
} }
@ -964,8 +973,11 @@ void int3_handler(struct x86_user_context *regs)
memset(&info, '\0', sizeof info); memset(&info, '\0', sizeof info);
info.si_code = TRAP_BRKPT; info.si_code = TRAP_BRKPT;
set_signal(SIGTRAP, regs, &info); set_signal(SIGTRAP, regs, &info);
if(interrupt_from_user(regs)){
cpu_enable_interrupt();
check_signal(0, regs, 0); check_signal(0, regs, 0);
check_need_resched(); check_need_resched();
}
set_cputime(0); set_cputime(0);
} }

View File

@ -363,7 +363,10 @@ static void page_fault_handler(void *fault_addr, uint64_t reason, void *regs)
info._sifields._sigfault.si_addr = fault_addr; info._sifields._sigfault.si_addr = fault_addr;
set_signal(SIGSEGV, regs, &info); set_signal(SIGSEGV, regs, &info);
} }
if(interrupt_from_user(regs)){
cpu_enable_interrupt();
check_signal(0, regs, 0); check_signal(0, regs, 0);
}
goto out; goto out;
} }