Can ISRs migrate to other CPUs when preempted?

In older versions of the Linux kernel, the interrupt service routines (ISRs) for hardware IRQs in an SMP system were executed on the CPU where they started, from the beginning to the end. If preempted by some other code, an ISR would resume afterwards on the same CPU.

But in recent kernels, most of the ISRs should be executed in the context of special kernel threads by default (http://lwn.net/Articles/433854/). The "ordinary" kernel threads can migrate to another CPU when preempted. So the question is, can ISRs also do such things now, for whatever reason?

Note that I am not talking about CPU affinity of the IRQs and IRQ balancing between the processors. I am curious about the situation when an interrupt handler is already running but is preempted.

That is, assume an ISR has already started executing on CPU #1. Now it is preempted by some higher priority code. When the latter has done its work, the ISR resumes execution - but on CPU #2. Are such situations possible?

The pointers to the relevant docs, discussions, etc., are always welcome.

5
задан Eugene 19 May 2011 в 12:46
поделиться