diff options
| -rw-r--r-- | kernel/sched.c | 2 | ||||
| -rw-r--r-- | kernel/softirq.c | 12 | 
2 files changed, 10 insertions, 4 deletions
| diff --git a/kernel/sched.c b/kernel/sched.c index bff9ef537df0..567f5cb9808c 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -1974,8 +1974,8 @@ void account_system_vtime(struct task_struct *curr)  	local_irq_save(flags); -	now = sched_clock();  	cpu = smp_processor_id(); +	now = sched_clock_cpu(cpu);  	delta = now - per_cpu(irq_start_time, cpu);  	per_cpu(irq_start_time, cpu) = now;  	/* diff --git a/kernel/softirq.c b/kernel/softirq.c index 267f7b763ebb..79ee8f1fc0e7 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -296,10 +296,16 @@ void irq_enter(void)  	rcu_irq_enter();  	if (idle_cpu(cpu) && !in_interrupt()) { -		__irq_enter(); +		/* +		 * Prevent raise_softirq from needlessly waking up ksoftirqd +		 * here, as softirq will be serviced on return from interrupt. +		 */ +		local_bh_disable();  		tick_check_idle(cpu); -	} else -		__irq_enter(); +		_local_bh_enable(); +	} + +	__irq_enter();  }  #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED | 
