ia64/xen-unstable

changeset 8812:a0e7daa2df33

Do_softirq is invoked at the path of ia64_leave_kernel instead of
being invoking in function irq_exit, which is aligned with XEN/X86 and
avoids __enter_schedule being reentered.

Signed-off-by Anthony Xu <anthony.xu@intel.com>
author kaf24@firebug.cl.cam.ac.uk
date Thu Feb 09 16:09:00 2006 +0100 (2006-02-09)
parents 4ee359893af4
children 71b0f00f6344
files xen/arch/ia64/linux-xen/entry.S xen/arch/ia64/xen/xenirq.c
line diff
     1.1 --- a/xen/arch/ia64/linux-xen/entry.S	Thu Feb 09 16:03:17 2006 +0100
     1.2 +++ b/xen/arch/ia64/linux-xen/entry.S	Thu Feb 09 16:09:00 2006 +0100
     1.3 @@ -895,6 +895,10 @@ GLOBAL_ENTRY(ia64_leave_kernel)
     1.4  #endif
     1.5  .work_processed_kernel:
     1.6  #ifdef XEN
     1.7 +(pUStk) ssm psr.i
     1.8 +(pUStk)    br.call.sptk.many b0=process_soft_irq
     1.9 +(pUStk) rsm psr.i
    1.10 +    ;;
    1.11  	alloc loc0=ar.pfs,0,1,1,0
    1.12  	adds out0=16,r12
    1.13      adds r7 = PT(EML_UNAT)+16,r12
    1.14 @@ -907,7 +911,7 @@ leave_kernel_self:
    1.15  (p8) br.sptk.few leave_kernel_self
    1.16  	;; 
    1.17  #endif
    1.18 -(p6)	br.call.sptk.many b0=deliver_pending_interrupt
    1.19 +(pUStk)	br.call.sptk.many b0=deliver_pending_interrupt
    1.20      ;;
    1.21  	mov ar.pfs=loc0
    1.22  	mov ar.unat=r7  /* load eml_unat  */
     2.1 --- a/xen/arch/ia64/xen/xenirq.c	Thu Feb 09 16:03:17 2006 +0100
     2.2 +++ b/xen/arch/ia64/xen/xenirq.c	Thu Feb 09 16:09:00 2006 +0100
     2.3 @@ -61,16 +61,20 @@ xen_do_IRQ(ia64_vector vector)
     2.4   */
     2.5  void xen_irq_exit(struct pt_regs *regs)
     2.6  {
     2.7 -	//account_system_vtime(current);
     2.8  	sub_preempt_count(IRQ_EXIT_OFFSET);
     2.9 -    if((((char *)regs) -(char *) current) != (IA64_STK_OFFSET-IA64_PT_REGS_SIZE))
    2.10 -        return;
    2.11 +}
    2.12  
    2.13 -	if (!in_interrupt()&&local_softirq_pending()) {
    2.14 +/*
    2.15 + * ONLY gets called from ia64_leave_kernel
    2.16 + * ONLY call with interrupts enabled
    2.17 + */
    2.18 +void process_soft_irq()
    2.19 +{
    2.20 +	if (!in_interrupt() && local_softirq_pending()) {
    2.21  		add_preempt_count(SOFTIRQ_OFFSET);
    2.22  		do_softirq();
    2.23  		sub_preempt_count(SOFTIRQ_OFFSET);
    2.24  	}
    2.25 -	//preempt_enable_no_resched();
    2.26  }
    2.27 +
    2.28  /* end from linux/kernel/softirq.c */