Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38ca9c92 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge tag 'cputime-cleanups-for-mingo' of...

Merge tag 'cputime-cleanups-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks

 into sched/core

Pull cputime cleanups and optimizations from Frederic Weisbecker:

 * Gather vtime headers that were a bit scattered around

 * Separate irqtime and vtime namespaces that were
   colliding, resulting in useless calls to irqtime accounting.

 * Slightly optimize irq and guest vtime accounting.

Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents e9c84cb8 3e1df4f5
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -106,9 +106,9 @@ void vtime_task_switch(struct task_struct *prev)
	struct thread_info *ni = task_thread_info(current);
	struct thread_info *ni = task_thread_info(current);


	if (idle_task(smp_processor_id()) != prev)
	if (idle_task(smp_processor_id()) != prev)
		vtime_account_system(prev);
		__vtime_account_system(prev);
	else
	else
		vtime_account_idle(prev);
		__vtime_account_idle(prev);


	vtime_account_user(prev);
	vtime_account_user(prev);


@@ -135,14 +135,14 @@ static cputime_t vtime_delta(struct task_struct *tsk)
	return delta_stime;
	return delta_stime;
}
}


void vtime_account_system(struct task_struct *tsk)
void __vtime_account_system(struct task_struct *tsk)
{
{
	cputime_t delta = vtime_delta(tsk);
	cputime_t delta = vtime_delta(tsk);


	account_system_time(tsk, 0, delta, delta);
	account_system_time(tsk, 0, delta, delta);
}
}


void vtime_account_idle(struct task_struct *tsk)
void __vtime_account_idle(struct task_struct *tsk)
{
{
	account_idle_time(vtime_delta(tsk));
	account_idle_time(vtime_delta(tsk));
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -336,7 +336,7 @@ static u64 vtime_delta(struct task_struct *tsk,
	return delta;
	return delta;
}
}


void vtime_account_system(struct task_struct *tsk)
void __vtime_account_system(struct task_struct *tsk)
{
{
	u64 delta, sys_scaled, stolen;
	u64 delta, sys_scaled, stolen;


@@ -346,7 +346,7 @@ void vtime_account_system(struct task_struct *tsk)
		account_steal_time(stolen);
		account_steal_time(stolen);
}
}


void vtime_account_idle(struct task_struct *tsk)
void __vtime_account_idle(struct task_struct *tsk)
{
{
	u64 delta, sys_scaled, stolen;
	u64 delta, sys_scaled, stolen;


+4 −0
Original line number Original line Diff line number Diff line
@@ -140,6 +140,10 @@ void vtime_account(struct task_struct *tsk)
}
}
EXPORT_SYMBOL_GPL(vtime_account);
EXPORT_SYMBOL_GPL(vtime_account);


void __vtime_account_system(struct task_struct *tsk)
__attribute__((alias("vtime_account")));
EXPORT_SYMBOL_GPL(__vtime_account_system);

void __kprobes vtime_stop_cpu(void)
void __kprobes vtime_stop_cpu(void)
{
{
	struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
	struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
+0 −4
Original line number Original line Diff line number Diff line
@@ -608,9 +608,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
		kvm_s390_deliver_pending_interrupts(vcpu);
		kvm_s390_deliver_pending_interrupts(vcpu);


	vcpu->arch.sie_block->icptcode = 0;
	vcpu->arch.sie_block->icptcode = 0;
	local_irq_disable();
	kvm_guest_enter();
	kvm_guest_enter();
	local_irq_enable();
	VCPU_EVENT(vcpu, 6, "entering sie flags %x",
	VCPU_EVENT(vcpu, 6, "entering sie flags %x",
		   atomic_read(&vcpu->arch.sie_block->cpuflags));
		   atomic_read(&vcpu->arch.sie_block->cpuflags));
	trace_kvm_s390_sie_enter(vcpu,
	trace_kvm_s390_sie_enter(vcpu,
@@ -629,9 +627,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
	VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
	VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
		   vcpu->arch.sie_block->icptcode);
		   vcpu->arch.sie_block->icptcode);
	trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode);
	trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode);
	local_irq_disable();
	kvm_guest_exit();
	kvm_guest_exit();
	local_irq_enable();


	memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);
	memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);
	return rc;
	return rc;
+3 −12
Original line number Original line Diff line number Diff line
@@ -4,6 +4,7 @@
#include <linux/preempt.h>
#include <linux/preempt.h>
#include <linux/lockdep.h>
#include <linux/lockdep.h>
#include <linux/ftrace_irq.h>
#include <linux/ftrace_irq.h>
#include <linux/vtime.h>
#include <asm/hardirq.h>
#include <asm/hardirq.h>


/*
/*
@@ -129,16 +130,6 @@ extern void synchronize_irq(unsigned int irq);
# define synchronize_irq(irq)	barrier()
# define synchronize_irq(irq)	barrier()
#endif
#endif


struct task_struct;

#if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING)
static inline void vtime_account(struct task_struct *tsk)
{
}
#else
extern void vtime_account(struct task_struct *tsk);
#endif

#if defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU)
#if defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU)


static inline void rcu_nmi_enter(void)
static inline void rcu_nmi_enter(void)
@@ -162,7 +153,7 @@ extern void rcu_nmi_exit(void);
 */
 */
#define __irq_enter()					\
#define __irq_enter()					\
	do {						\
	do {						\
		vtime_account(current);		\
		vtime_account_irq_enter(current);	\
		add_preempt_count(HARDIRQ_OFFSET);	\
		add_preempt_count(HARDIRQ_OFFSET);	\
		trace_hardirq_enter();			\
		trace_hardirq_enter();			\
	} while (0)
	} while (0)
@@ -178,7 +169,7 @@ extern void irq_enter(void);
#define __irq_exit()					\
#define __irq_exit()					\
	do {						\
	do {						\
		trace_hardirq_exit();			\
		trace_hardirq_exit();			\
		vtime_account(current);		\
		vtime_account_irq_exit(current);	\
		sub_preempt_count(HARDIRQ_OFFSET);	\
		sub_preempt_count(HARDIRQ_OFFSET);	\
	} while (0)
	} while (0)


Loading