at v4.2-rc7 2.5 kB view raw
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 11extern void context_tracking_cpu_set(int cpu); 12 13extern void context_tracking_enter(enum ctx_state state); 14extern void context_tracking_exit(enum ctx_state state); 15extern void context_tracking_user_enter(void); 16extern void context_tracking_user_exit(void); 17 18static inline void user_enter(void) 19{ 20 if (context_tracking_is_enabled()) 21 context_tracking_user_enter(); 22 23} 24static inline void user_exit(void) 25{ 26 if (context_tracking_is_enabled()) 27 context_tracking_user_exit(); 28} 29 30static inline enum ctx_state exception_enter(void) 31{ 32 enum ctx_state prev_ctx; 33 34 if (!context_tracking_is_enabled()) 35 return 0; 36 37 prev_ctx = this_cpu_read(context_tracking.state); 38 if (prev_ctx != CONTEXT_KERNEL) 39 context_tracking_exit(prev_ctx); 40 41 return prev_ctx; 42} 43 44static inline void exception_exit(enum ctx_state prev_ctx) 45{ 46 if (context_tracking_is_enabled()) { 47 if (prev_ctx != CONTEXT_KERNEL) 48 context_tracking_enter(prev_ctx); 49 } 50} 51 52#else 53static inline void user_enter(void) { } 54static inline void user_exit(void) { } 55static inline enum ctx_state exception_enter(void) { return 0; } 56static inline void exception_exit(enum ctx_state prev_ctx) { } 57#endif /* !CONFIG_CONTEXT_TRACKING */ 58 59 60#ifdef CONFIG_CONTEXT_TRACKING_FORCE 61extern void context_tracking_init(void); 62#else 63static inline void context_tracking_init(void) { } 64#endif /* CONFIG_CONTEXT_TRACKING_FORCE */ 65 66 67#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN 68static inline void guest_enter(void) 69{ 70 if (vtime_accounting_enabled()) 71 vtime_guest_enter(current); 72 else 73 current->flags |= PF_VCPU; 74 75 if (context_tracking_is_enabled()) 76 context_tracking_enter(CONTEXT_GUEST); 77} 78 79static inline void guest_exit(void) 80{ 81 if (context_tracking_is_enabled()) 82 context_tracking_exit(CONTEXT_GUEST); 83 84 if (vtime_accounting_enabled()) 85 vtime_guest_exit(current); 86 else 87 current->flags &= ~PF_VCPU; 88} 89 90#else 91static inline void guest_enter(void) 92{ 93 /* 94 * This is running in ioctl context so its safe 95 * to assume that it's the stime pending cputime 96 * to flush. 97 */ 98 vtime_account_system(current); 99 current->flags |= PF_VCPU; 100} 101 102static inline void guest_exit(void) 103{ 104 /* Flush the guest cputime we spent on the guest */ 105 vtime_account_system(current); 106 current->flags &= ~PF_VCPU; 107} 108#endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ 109 110#endif