1 #ifndef _LINUX_CONTEXT_TRACKING_H 2 #define _LINUX_CONTEXT_TRACKING_H 3 4 #include <linux/sched.h> 5 #include <linux/vtime.h> 6 #include <linux/context_tracking_state.h> 7 #include <asm/ptrace.h> 8 9 10 #ifdef CONFIG_CONTEXT_TRACKING 11 extern void context_tracking_cpu_set(int cpu); 12 13 extern void context_tracking_user_enter(void); 14 extern void context_tracking_user_exit(void); 15 extern void __context_tracking_task_switch(struct task_struct *prev, 16 struct task_struct *next); 17 18 static inline void user_enter(void) 19 { 20 if (static_key_false(&context_tracking_enabled)) 21 context_tracking_user_enter(); 22 23 } 24 static inline void user_exit(void) 25 { 26 if (static_key_false(&context_tracking_enabled)) 27 context_tracking_user_exit(); 28 } 29 30 static inline enum ctx_state exception_enter(void) 31 { 32 enum ctx_state prev_ctx; 33 34 if (!static_key_false(&context_tracking_enabled)) 35 return 0; 36 37 prev_ctx = this_cpu_read(context_tracking.state); 38 context_tracking_user_exit(); 39 40 return prev_ctx; 41 } 42 43 static inline void exception_exit(enum ctx_state prev_ctx) 44 { 45 if (static_key_false(&context_tracking_enabled)) { 46 if (prev_ctx == IN_USER) 47 context_tracking_user_enter(); 48 } 49 } 50 51 static inline void context_tracking_task_switch(struct task_struct *prev, 52 struct task_struct *next) 53 { 54 if (static_key_false(&context_tracking_enabled)) 55 __context_tracking_task_switch(prev, next); 56 } 57 #else 58 static inline void user_enter(void) { } 59 static inline void user_exit(void) { } 60 static inline enum ctx_state exception_enter(void) { return 0; } 61 static inline void exception_exit(enum ctx_state prev_ctx) { } 62 static inline void context_tracking_task_switch(struct task_struct *prev, 63 struct task_struct *next) { } 64 #endif /* !CONFIG_CONTEXT_TRACKING */ 65 66 67 #ifdef CONFIG_CONTEXT_TRACKING_FORCE 68 extern void context_tracking_init(void); 69 #else 70 static inline void context_tracking_init(void) { } 71 #endif /* CONFIG_CONTEXT_TRACKING_FORCE */ 72 73 74 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN 75 static inline void guest_enter(void) 76 { 77 if (vtime_accounting_enabled()) 78 vtime_guest_enter(current); 79 else 80 current->flags |= PF_VCPU; 81 } 82 83 static inline void guest_exit(void) 84 { 85 if (vtime_accounting_enabled()) 86 vtime_guest_exit(current); 87 else 88 current->flags &= ~PF_VCPU; 89 } 90 91 #else 92 static inline void guest_enter(void) 93 { 94 /* 95 * This is running in ioctl context so its safe 96 * to assume that it's the stime pending cputime 97 * to flush. 98 */ 99 vtime_account_system(current); 100 current->flags |= PF_VCPU; 101 } 102 103 static inline void guest_exit(void) 104 { 105 /* Flush the guest cputime we spent on the guest */ 106 vtime_account_system(current); 107 current->flags &= ~PF_VCPU; 108 } 109 #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ 110 111 #endif 112