direct-io.hg
changeset 8805: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>
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 */