~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/context_tracking.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef _LINUX_CONTEXT_TRACKING_H
  3 #define _LINUX_CONTEXT_TRACKING_H
  4 
  5 #include <linux/sched.h>
  6 #include <linux/vtime.h>
  7 #include <linux/context_tracking_state.h>
  8 #include <linux/instrumentation.h>
  9 
 10 #include <asm/ptrace.h>
 11 
 12 
 13 #ifdef CONFIG_CONTEXT_TRACKING_USER
 14 extern void ct_cpu_track_user(int cpu);
 15 
 16 /* Called with interrupts disabled.  */
 17 extern void __ct_user_enter(enum ctx_state state);
 18 extern void __ct_user_exit(enum ctx_state state);
 19 
 20 extern void ct_user_enter(enum ctx_state state);
 21 extern void ct_user_exit(enum ctx_state state);
 22 
 23 extern void user_enter_callable(void);
 24 extern void user_exit_callable(void);
 25 
 26 static inline void user_enter(void)
 27 {
 28         if (context_tracking_enabled())
 29                 ct_user_enter(CONTEXT_USER);
 30 
 31 }
 32 static inline void user_exit(void)
 33 {
 34         if (context_tracking_enabled())
 35                 ct_user_exit(CONTEXT_USER);
 36 }
 37 
 38 /* Called with interrupts disabled.  */
 39 static __always_inline void user_enter_irqoff(void)
 40 {
 41         if (context_tracking_enabled())
 42                 __ct_user_enter(CONTEXT_USER);
 43 
 44 }
 45 static __always_inline void user_exit_irqoff(void)
 46 {
 47         if (context_tracking_enabled())
 48                 __ct_user_exit(CONTEXT_USER);
 49 }
 50 
 51 static inline enum ctx_state exception_enter(void)
 52 {
 53         enum ctx_state prev_ctx;
 54 
 55         if (IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK) ||
 56             !context_tracking_enabled())
 57                 return 0;
 58 
 59         prev_ctx = __ct_state();
 60         if (prev_ctx != CONTEXT_KERNEL)
 61                 ct_user_exit(prev_ctx);
 62 
 63         return prev_ctx;
 64 }
 65 
 66 static inline void exception_exit(enum ctx_state prev_ctx)
 67 {
 68         if (!IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK) &&
 69             context_tracking_enabled()) {
 70                 if (prev_ctx != CONTEXT_KERNEL)
 71                         ct_user_enter(prev_ctx);
 72         }
 73 }
 74 
 75 static __always_inline bool context_tracking_guest_enter(void)
 76 {
 77         if (context_tracking_enabled())
 78                 __ct_user_enter(CONTEXT_GUEST);
 79 
 80         return context_tracking_enabled_this_cpu();
 81 }
 82 
 83 static __always_inline bool context_tracking_guest_exit(void)
 84 {
 85         if (context_tracking_enabled())
 86                 __ct_user_exit(CONTEXT_GUEST);
 87 
 88         return context_tracking_enabled_this_cpu();
 89 }
 90 
 91 #define CT_WARN_ON(cond) WARN_ON(context_tracking_enabled() && (cond))
 92 
 93 #else
 94 static inline void user_enter(void) { }
 95 static inline void user_exit(void) { }
 96 static inline void user_enter_irqoff(void) { }
 97 static inline void user_exit_irqoff(void) { }
 98 static inline int exception_enter(void) { return 0; }
 99 static inline void exception_exit(enum ctx_state prev_ctx) { }
100 static inline int ct_state(void) { return -1; }
101 static inline int __ct_state(void) { return -1; }
102 static __always_inline bool context_tracking_guest_enter(void) { return false; }
103 static __always_inline bool context_tracking_guest_exit(void) { return false; }
104 #define CT_WARN_ON(cond) do { } while (0)
105 #endif /* !CONFIG_CONTEXT_TRACKING_USER */
106 
107 #ifdef CONFIG_CONTEXT_TRACKING_USER_FORCE
108 extern void context_tracking_init(void);
109 #else
110 static inline void context_tracking_init(void) { }
111 #endif /* CONFIG_CONTEXT_TRACKING_USER_FORCE */
112 
113 #ifdef CONFIG_CONTEXT_TRACKING_IDLE
114 extern void ct_idle_enter(void);
115 extern void ct_idle_exit(void);
116 
117 /*
118  * Is the current CPU in an extended quiescent state?
119  *
120  * No ordering, as we are sampling CPU-local information.
121  */
122 static __always_inline bool rcu_dynticks_curr_cpu_in_eqs(void)
123 {
124         return !(raw_atomic_read(this_cpu_ptr(&context_tracking.state)) & RCU_DYNTICKS_IDX);
125 }
126 
127 /*
128  * Increment the current CPU's context_tracking structure's ->state field
129  * with ordering.  Return the new value.
130  */
131 static __always_inline unsigned long ct_state_inc(int incby)
132 {
133         return raw_atomic_add_return(incby, this_cpu_ptr(&context_tracking.state));
134 }
135 
136 static __always_inline bool warn_rcu_enter(void)
137 {
138         bool ret = false;
139 
140         /*
141          * Horrible hack to shut up recursive RCU isn't watching fail since
142          * lots of the actual reporting also relies on RCU.
143          */
144         preempt_disable_notrace();
145         if (rcu_dynticks_curr_cpu_in_eqs()) {
146                 ret = true;
147                 ct_state_inc(RCU_DYNTICKS_IDX);
148         }
149 
150         return ret;
151 }
152 
153 static __always_inline void warn_rcu_exit(bool rcu)
154 {
155         if (rcu)
156                 ct_state_inc(RCU_DYNTICKS_IDX);
157         preempt_enable_notrace();
158 }
159 
160 #else
161 static inline void ct_idle_enter(void) { }
162 static inline void ct_idle_exit(void) { }
163 
164 static __always_inline bool warn_rcu_enter(void) { return false; }
165 static __always_inline void warn_rcu_exit(bool rcu) { }
166 #endif /* !CONFIG_CONTEXT_TRACKING_IDLE */
167 
168 #endif
169 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php