There are currently three places in xen code where do_softirq() is
- return to the guest from the hypervisor decrementer interrupt handler
- return to the guest from a hypercall()
- in idle_loop()
But it is kind of strange that do_softirq() is not called after external
LOADADDR r12, do_external
mr r3, r1 /* pass pointer to cpu_user_regs */
subi r1, r1, STACK_FRAME_OVERHEAD /* make a "caller" stack frame */
addi r1, r1, STACK_FRAME_OVERHEAD /* restore stack to cpu_user_regs */
This can cause quite large delay in interrupt processing because context
switching is done by SCHEDULE_SOFTIRQ.
For example, Let's assume that domU is now running and there is an
- domU is interrupted and Xen's do_external() is called
- an event channel toward dom0 is set to 'pending'
- domU is resumed by fast_resume
- dom0 is never scheduled even if it has the higher priority until
do_softirq() is called by the next hyperviosr decrementer interrupt.
When I look at the same parts for the x86 arch, it seems that softirq is
processed in every 'ret_from_int' which, I think, is expected behaviour.
Is there anyone who can tell me the reason why do_softirq() is not
called after external interrupt handling? Or is it just a simple
missing(but important) code in XenPPC port ?
- HyeonSeung Jang.
Xen-ppc-devel mailing list