diff options
Diffstat (limited to 'arch/s390/kernel/irq.c')
| -rw-r--r-- | arch/s390/kernel/irq.c | 50 | 
1 files changed, 20 insertions, 30 deletions
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index 8ac2097f13d4..bb27a262c44a 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c @@ -157,39 +157,29 @@ int arch_show_interrupts(struct seq_file *p, int prec)  /*   * Switch to the asynchronous interrupt stack for softirq execution.   */ -asmlinkage void do_softirq(void) +void do_softirq_own_stack(void)  { -	unsigned long flags, old, new; +	unsigned long old, new; -	if (in_interrupt()) -		return; - -	local_irq_save(flags); - -	if (local_softirq_pending()) { -		/* Get current stack pointer. */ -		asm volatile("la %0,0(15)" : "=a" (old)); -		/* Check against async. stack address range. */ -		new = S390_lowcore.async_stack; -		if (((new - old) >> (PAGE_SHIFT + THREAD_ORDER)) != 0) { -			/* Need to switch to the async. stack. */ -			new -= STACK_FRAME_OVERHEAD; -			((struct stack_frame *) new)->back_chain = old; - -			asm volatile("   la    15,0(%0)\n" -				     "   basr  14,%2\n" -				     "   la    15,0(%1)\n" -				     : : "a" (new), "a" (old), -				         "a" (__do_softirq) -				     : "0", "1", "2", "3", "4", "5", "14", -				       "cc", "memory" ); -		} else { -			/* We are already on the async stack. */ -			__do_softirq(); -		} +	/* Get current stack pointer. */ +	asm volatile("la %0,0(15)" : "=a" (old)); +	/* Check against async. stack address range. */ +	new = S390_lowcore.async_stack; +	if (((new - old) >> (PAGE_SHIFT + THREAD_ORDER)) != 0) { +		/* Need to switch to the async. stack. */ +		new -= STACK_FRAME_OVERHEAD; +		((struct stack_frame *) new)->back_chain = old; +		asm volatile("   la    15,0(%0)\n" +			     "   basr  14,%2\n" +			     "   la    15,0(%1)\n" +			     : : "a" (new), "a" (old), +			         "a" (__do_softirq) +			     : "0", "1", "2", "3", "4", "5", "14", +			       "cc", "memory" ); +	} else { +		/* We are already on the async stack. */ +		__do_softirq();  	} - -	local_irq_restore(flags);  }  /*  | 
