mirror of
https://github.com/torvalds/linux.git
synced 2026-10-07 22:37:45 -04:00
The host kernel is not doing anything while the CPU is executing a KVM guest VCPU, so it can be marked as being in an extended quiescent state, identical to that used when running user space code. The only exception to that rule is when the host handles an interrupt, which is already handled by the irq code, which calls rcu_irq_enter and rcu_irq_exit. The guest_enter and guest_exit functions already switch vtime accounting independent of context tracking. Leave those calls where they are, instead of moving them into the context tracking code. Reviewed-by: Paul E. McKenney <[email protected]> Signed-off-by: Rik van Riel <[email protected]> Cc: Paul E. McKenney <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Will deacon <[email protected]> Cc: Marcelo Tosatti <[email protected]> Cc: Christian Borntraeger <[email protected]> Cc: Luiz Capitulino <[email protected]> Cc: Paolo Bonzini <[email protected]> Signed-off-by: Frederic Weisbecker <[email protected]>
48 lines
1.3 KiB
C
48 lines
1.3 KiB
C
#ifndef _LINUX_CONTEXT_TRACKING_STATE_H
|
|
#define _LINUX_CONTEXT_TRACKING_STATE_H
|
|
|
|
#include <linux/percpu.h>
|
|
#include <linux/static_key.h>
|
|
|
|
struct context_tracking {
|
|
/*
|
|
* When active is false, probes are unset in order
|
|
* to minimize overhead: TIF flags are cleared
|
|
* and calls to user_enter/exit are ignored. This
|
|
* may be further optimized using static keys.
|
|
*/
|
|
bool active;
|
|
enum ctx_state {
|
|
CONTEXT_KERNEL = 0,
|
|
CONTEXT_USER,
|
|
CONTEXT_GUEST,
|
|
} state;
|
|
};
|
|
|
|
#ifdef CONFIG_CONTEXT_TRACKING
|
|
extern struct static_key context_tracking_enabled;
|
|
DECLARE_PER_CPU(struct context_tracking, context_tracking);
|
|
|
|
static inline bool context_tracking_is_enabled(void)
|
|
{
|
|
return static_key_false(&context_tracking_enabled);
|
|
}
|
|
|
|
static inline bool context_tracking_cpu_is_enabled(void)
|
|
{
|
|
return __this_cpu_read(context_tracking.active);
|
|
}
|
|
|
|
static inline bool context_tracking_in_user(void)
|
|
{
|
|
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
|