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

Commit e95e7f62 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'timers-nohz-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull NOHZ changes from Ingo Molnar:
 "This tree adds full dynticks support to KVM guests (support the
  disabling of the timer tick on the guest).  The main missing piece was
  the recognition of guest execution as RCU extended quiescent state and
  related changes"

* 'timers-nohz-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  kvm,rcu,nohz: use RCU extended quiescent state when running KVM guest
  context_tracking: Export context_tracking_user_enter/exit
  context_tracking: Run vtime_user_enter/exit only when state == CONTEXT_USER
  context_tracking: Add stub context_tracking_is_enabled
  context_tracking: Generalize context tracking APIs to support user and guest
  context_tracking: Rename context symbols to prepare for transition state
  ppc: Remove unused cpp symbols in kvm headers
parents 078838d5 1524b745
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -106,10 +106,6 @@ struct kvmppc_vcpu_book3s {
	spinlock_t mmu_lock;
};

#define CONTEXT_HOST		0
#define CONTEXT_GUEST		1
#define CONTEXT_GUEST_END	2

#define VSID_REAL	0x07ffffffffc00000ULL
#define VSID_BAT	0x07ffffffffb00000ULL
#define VSID_64K	0x0800000000000000ULL
+1 −1
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@ enum ctx_state ist_enter(struct pt_regs *regs)
		 * but we need to notify RCU.
		 */
		rcu_nmi_enter();
		prev_state = IN_KERNEL;  /* the value is irrelevant. */
		prev_state = CONTEXT_KERNEL;  /* the value is irrelevant. */
	}

	/*
+12 −3
Original line number Diff line number Diff line
@@ -10,6 +10,8 @@
#ifdef CONFIG_CONTEXT_TRACKING
extern void context_tracking_cpu_set(int cpu);

extern void context_tracking_enter(enum ctx_state state);
extern void context_tracking_exit(enum ctx_state state);
extern void context_tracking_user_enter(void);
extern void context_tracking_user_exit(void);
extern void __context_tracking_task_switch(struct task_struct *prev,
@@ -35,7 +37,8 @@ static inline enum ctx_state exception_enter(void)
		return 0;

	prev_ctx = this_cpu_read(context_tracking.state);
	context_tracking_user_exit();
	if (prev_ctx != CONTEXT_KERNEL)
		context_tracking_exit(prev_ctx);

	return prev_ctx;
}
@@ -43,8 +46,8 @@ static inline enum ctx_state exception_enter(void)
static inline void exception_exit(enum ctx_state prev_ctx)
{
	if (context_tracking_is_enabled()) {
		if (prev_ctx == IN_USER)
			context_tracking_user_enter();
		if (prev_ctx != CONTEXT_KERNEL)
			context_tracking_enter(prev_ctx);
	}
}

@@ -78,10 +81,16 @@ static inline void guest_enter(void)
		vtime_guest_enter(current);
	else
		current->flags |= PF_VCPU;

	if (context_tracking_is_enabled())
		context_tracking_enter(CONTEXT_GUEST);
}

static inline void guest_exit(void)
{
	if (context_tracking_is_enabled())
		context_tracking_exit(CONTEXT_GUEST);

	if (vtime_accounting_enabled())
		vtime_guest_exit(current);
	else
+6 −3
Original line number Diff line number Diff line
@@ -13,8 +13,9 @@ struct context_tracking {
	 */
	bool active;
	enum ctx_state {
		IN_KERNEL = 0,
		IN_USER,
		CONTEXT_KERNEL = 0,
		CONTEXT_USER,
		CONTEXT_GUEST,
	} state;
};

@@ -34,11 +35,13 @@ static inline bool context_tracking_cpu_is_enabled(void)

static inline bool context_tracking_in_user(void)
{
	return __this_cpu_read(context_tracking.state) == IN_USER;
	return __this_cpu_read(context_tracking.state) == CONTEXT_USER;
}
#else
static inline bool context_tracking_in_user(void) { return false; }
static inline bool context_tracking_active(void) { return false; }
static inline bool context_tracking_is_enabled(void) { return false; }
static inline bool context_tracking_cpu_is_enabled(void) { return false; }
#endif /* CONFIG_CONTEXT_TRACKING */

#endif
+2 −1
Original line number Diff line number Diff line
@@ -779,6 +779,7 @@ static inline void kvm_guest_enter(void)
	 * one time slice). Lets treat guest mode as quiescent state, just like
	 * we do with user-mode execution.
	 */
	if (!context_tracking_cpu_is_enabled())
		rcu_virt_note_context_switch(smp_processor_id());
}

Loading