Now I'm sure
What you're talking about is process preemption
, or preemptive scheduling
, and what you explain is correct. It is about how the currently running process can be preempted when a process of higher priority changes to the TASK_RUNNING state (regardless of the Mode the original process was running in). See section Process Preemption
from Chapter 10 of Understanding the Linux Kernel.
But a slightly different thing is Kernel Preemption, which basically defines if the currently running process can be preempted while it is executing specifically kernel code
(i.e. a system call) and switched to the kernel code
of another higher priority process which becomes runnable (i.e. a process waiting inside a read() syscall waking up because the user pressed a key). You can read this from section Kernel Preemption
from Chapter 5 of the same book.
And jhwilliams, in the last link you can read about how Kernel Preemption reduces dispatch latency
and how this benefits some kind of processes (movie players, etc).