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
interrupt handler,

    LOADADDR r12, do_external
    mr r3, r1                           /* pass pointer to cpu_user_regs */
    subi r1, r1, STACK_FRAME_OVERHEAD   /* make a "caller" stack frame */
    CALL_CFUNC r12

    addi r1, r1, STACK_FRAME_OVERHEAD   /* restore stack to cpu_user_regs */
    b fast_resume

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
external interrupt. 

  - 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

Reply via email to