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>
This commit is contained in:
kaf24@firebug.cl.cam.ac.uk committed 2006-02-09 16:09:00 +01:00
1 parent 6d3a6af8ed
commit cbed226d72
2 files changed
+14 -6

No files matched your search

+5 -1
View File
@@ -895,6 +895,10 @@ GLOBAL_ENTRY(ia64_leave_kernel)
#endif
.work_processed_kernel:
#ifdef XEN
(pUStk) ssm psr.i
(pUStk) br.call.sptk.many b0=process_soft_irq
(pUStk) rsm psr.i
;;
alloc loc0=ar.pfs,0,1,1,0
adds out0=16,r12
adds r7 = PT(EML_UNAT)+16,r12
@@ -907,7 +911,7 @@ leave_kernel_self:
(p8) br.sptk.few leave_kernel_self
;;
#endif
(p6) br.call.sptk.many b0=deliver_pending_interrupt
(pUStk) br.call.sptk.many b0=deliver_pending_interrupt
;;
mov ar.pfs=loc0
mov ar.unat=r7 /* load eml_unat */
+9 -5
View File
@@ -61,16 +61,20 @@ xen_do_IRQ(ia64_vector vector)
*/
void xen_irq_exit(struct pt_regs *regs)
{
//account_system_vtime(current);
sub_preempt_count(IRQ_EXIT_OFFSET);
if((((char *)regs) -(char *) current) != (IA64_STK_OFFSET-IA64_PT_REGS_SIZE))
return;
}
if (!in_interrupt()&&local_softirq_pending()) {
/*
* ONLY gets called from ia64_leave_kernel
* ONLY call with interrupts enabled
*/
void process_soft_irq()
{
if (!in_interrupt() && local_softirq_pending()) {
add_preempt_count(SOFTIRQ_OFFSET);
do_softirq();
sub_preempt_count(SOFTIRQ_OFFSET);
}
//preempt_enable_no_resched();
}
/* end from linux/kernel/softirq.c */
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.