keep track of IRQ context and don't do thread migration there
This commit is contained in:
@ -610,6 +610,9 @@ extern void tlb_flush_handler(int vector);
|
||||
void handle_interrupt(int vector, struct x86_user_context *regs)
|
||||
{
|
||||
struct ihk_mc_interrupt_handler *h;
|
||||
struct cpu_local_var *v = get_this_cpu_local_var();
|
||||
|
||||
v->in_interrupt = 1;
|
||||
|
||||
lapic_ack();
|
||||
|
||||
@ -680,6 +683,8 @@ void handle_interrupt(int vector, struct x86_user_context *regs)
|
||||
|
||||
check_signal(0, regs, 0);
|
||||
check_need_resched();
|
||||
|
||||
v->in_interrupt = 0;
|
||||
}
|
||||
|
||||
void gpe_handler(struct x86_user_context *regs)
|
||||
|
||||
@ -67,6 +67,7 @@ struct cpu_local_var {
|
||||
|
||||
ihk_spinlock_t migq_lock;
|
||||
struct list_head migq;
|
||||
int in_interrupt;
|
||||
} __attribute__((aligned(64)));
|
||||
|
||||
|
||||
|
||||
@ -2293,7 +2293,7 @@ redo:
|
||||
ihk_mc_spinlock_unlock(&(v->runq_lock), irqstate);
|
||||
}
|
||||
|
||||
if (v->flags & CPU_FLAG_NEED_MIGRATE) {
|
||||
if (v->flags & CPU_FLAG_NEED_MIGRATE && !v->in_interrupt) {
|
||||
v->flags &= ~CPU_FLAG_NEED_MIGRATE;
|
||||
do_migrate();
|
||||
goto redo;
|
||||
|
||||
Reference in New Issue
Block a user