preempt_enable()이 nmi 안에 있으면 어떻게 되나요?

preempt_enable()이 nmi 안에 있으면 어떻게 되나요?

https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-8/-/blob/ccf40dfacd314ab0fea16cfc6f4eded1a08e2710/arch/x86/kernel/cpu/mce/core.c#L1331

preempt_enable()이전에는 nmi_exit()좋은 코드인가요?

    if ((m.cs & 3) == 3) {
        /* If this triggers there is no way to recover. Die hard. */
        BUG_ON(!on_thread_stack() || !user_mode(regs));
        local_irq_enable();
        preempt_enable();

        current->task_struct_rh->mce_ripv = !!(m.mcgstatus & MCG_STATUS_RIPV);
        current->task_struct_rh->mce_whole_page = whole_page(&m);

        if (kill_it || do_memory_failure(&m))
            force_sig(SIGBUS, current);
        preempt_disable();
        local_irq_disable();
    } else {
        if (!fixup_exception(regs, X86_TRAP_MC))
            mce_panic("Failed kernel mode recovery", &m, NULL);
    }

out_ist:
    nmi_exit();
}

제가 이해한 바에 따르면 커널이 선점할 수 없다면 preempt_count > 0이 경우에는 NMI 내부에 있으므로 preempt_count > 0.

SIGBUS를 보내는 중입니다.

force_sig(SIGBUS, current);

local_irq_enableand 를 할 필요가 없는 것 같나요 preempt_enable?

관련 정보