On Mon, Sep 13 2021 at 13:01, Sohil Mehta wrote:
A user interrupt notification vector is used on the receiver's cpu toWhat happens if the SENDUIPI is issued when the target task is not on
identify an interrupt as a user interrupt (and not a kernel interrupt).
Hardware uses the same notification vector to generate an IPI from a
sender's cpu core when the SENDUIPI instruction is executed.
Typically, the kernel shouldn't receive an interrupt with this vector.
However, it is possible that the kernel might receive this vector.
Scenario that can cause the spurious interrupt:
Step cpu 0 (receiver task) cpu 1 (sender task)
---- --------------------- -------------------
1 task is running
2 executes SENDUIPI
3 IPI sent
4 context switched out
5 IPI delivered
(kernel interrupt detected)
A kernel interrupt can be detected, if a receiver task gets scheduled
out after the SENDUIPI-based IPI was sent but before the IPI was
delivered.
the CPU? How is that any different from the above?
The kernel doesn't need to do anything in this case other than receivingSo why on earth is that vector reaching the CPU at all?
the interrupt and clearing the local APIC. The user interrupt is always
stored in the receiver's UPID before the IPI is generated. When the
receiver gets scheduled back the interrupt would be delivered based on
its UPID.
Will fix this.+#ifdef CONFIG_X86_USER_INTERRUPTSNo point in printing that when user interrupts are not available/enabled
+ seq_printf(p, "%*s: ", prec, "UIS");
on the system.