Each CPU has queues for scheduled (high-priority and normal) tasklets.
When a CPU is about to return to user space from an interrupt or from a system call, it checks for scheduled tasklets, and executes them.
The same checks are done again after a tasklet has finished.
(If there are too many scheduled tasklets, they are not all executed at once, but moved into a kernel thread, ksoftirqd
; but the principle stays the same.)
Therefore, a tasklet will never interrupt another tasklet, but a high-priority tasklet will be executed before any scheduled 'normal' tasklets.