Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 #ifndef __LINUX_PREEMPT_H
  2 #define __LINUX_PREEMPT_H
  3 
  4 /*
  5  * include/linux/preempt.h - macros for accessing and manipulating
  6  * preempt_count (used for kernel preemption, interrupt count, etc.)
  7  */
  8 
  9 #include <linux/thread_info.h>
 10 #include <linux/linkage.h>
 11 #include <linux/list.h>
 12 #include <linux/thread_info.h>
 13 
 14 #if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER) || \
 15         defined(CONFIG_PREEMPT_TRACE)
 16   extern void add_preempt_count(int val);
 17   extern void sub_preempt_count(int val);
 18 #else
 19 # define add_preempt_count(val) do { preempt_count() += (val); } while (0)
 20 # define sub_preempt_count(val) do { preempt_count() -= (val); } while (0)
 21 #endif
 22 
 23 #define inc_preempt_count() add_preempt_count(1)
 24 #define dec_preempt_count() sub_preempt_count(1)
 25 
 26 #define preempt_count()         (current_thread_info()->preempt_count)
 27 
 28 #ifdef CONFIG_PREEMPT
 29 
 30 asmlinkage void preempt_schedule(void);
 31 asmlinkage void preempt_schedule_irq(void);
 32 
 33 #define preempt_disable() \
 34 do { \
 35         inc_preempt_count(); \
 36         barrier(); \
 37 } while (0)
 38 
 39 #define __preempt_enable_no_resched() \
 40 do { \
 41         barrier(); \
 42         dec_preempt_count(); \
 43 } while (0)
 44 
 45 
 46 #ifdef CONFIG_DEBUG_PREEMPT
 47 extern void notrace preempt_enable_no_resched(void);
 48 #else
 49 # define preempt_enable_no_resched() __preempt_enable_no_resched()
 50 #endif
 51 
 52 #define preempt_check_resched() \
 53 do { \
 54         if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \
 55                 preempt_schedule(); \
 56 } while (0)
 57 
 58 #define preempt_check_resched_delayed() \
 59 do { \
 60         if (unlikely(test_thread_flag(TIF_NEED_RESCHED_DELAYED))) \
 61                 preempt_schedule(); \
 62 } while (0)
 63 
 64 #define preempt_enable() \
 65 do { \
 66         __preempt_enable_no_resched(); \
 67         barrier(); \
 68         preempt_check_resched(); \
 69 } while (0)
 70 
 71 /* For debugging and tracer internals only! */
 72 #define add_preempt_count_notrace(val)                  \
 73         do { preempt_count() += (val); } while (0)
 74 #define sub_preempt_count_notrace(val)                  \
 75         do { preempt_count() -= (val); } while (0)
 76 #define inc_preempt_count_notrace() add_preempt_count_notrace(1)
 77 #define dec_preempt_count_notrace() sub_preempt_count_notrace(1)
 78 
 79 #define preempt_disable_notrace() \
 80 do { \
 81         inc_preempt_count_notrace(); \
 82         barrier(); \
 83 } while (0)
 84 
 85 #define preempt_enable_no_resched_notrace() \
 86 do { \
 87         barrier(); \
 88         dec_preempt_count_notrace(); \
 89 } while (0)
 90 
 91 /* preempt_check_resched is OK to trace */
 92 #define preempt_enable_notrace() \
 93 do { \
 94         preempt_enable_no_resched_notrace(); \
 95         barrier(); \
 96         preempt_check_resched(); \
 97 } while (0)
 98 
 99 #else
100 
101 #define preempt_disable()               do { } while (0)
102 #define preempt_enable_no_resched()     do { } while (0)
103 #define __preempt_enable_no_resched()   do { } while (0)
104 #define preempt_enable()                do { } while (0)
105 #define preempt_check_resched()         do { } while (0)
106 #define preempt_check_resched_delayed() do { } while (0)
107 
108 #define preempt_disable_notrace()               do { } while (0)
109 #define preempt_enable_no_resched_notrace()     do { } while (0)
110 #define preempt_enable_notrace()                do { } while (0)
111 
112 #define preempt_schedule_irq()          do { } while (0)
113 
114 #endif
115 
116 #ifdef CONFIG_PREEMPT_NOTIFIERS
117 
118 struct preempt_notifier;
119 
120 /**
121  * preempt_ops - notifiers called when a task is preempted and rescheduled
122  * @sched_in: we're about to be rescheduled:
123  *    notifier: struct preempt_notifier for the task being scheduled
124  *    cpu:  cpu we're scheduled on
125  * @sched_out: we've just been preempted
126  *    notifier: struct preempt_notifier for the task being preempted
127  *    next: the task that's kicking us out
128  */
129 struct preempt_ops {
130         void (*sched_in)(struct preempt_notifier *notifier, int cpu);
131         void (*sched_out)(struct preempt_notifier *notifier,
132                           struct task_struct *next);
133 };
134 
135 /**
136  * preempt_notifier - key for installing preemption notifiers
137  * @link: internal use
138  * @ops: defines the notifier functions to be called
139  *
140  * Usually used in conjunction with container_of().
141  */
142 struct preempt_notifier {
143         struct hlist_node link;
144         struct preempt_ops *ops;
145 };
146 
147 void preempt_notifier_register(struct preempt_notifier *notifier);
148 void preempt_notifier_unregister(struct preempt_notifier *notifier);
149 
150 static inline void preempt_notifier_init(struct preempt_notifier *notifier,
151                                      struct preempt_ops *ops)
152 {
153         INIT_HLIST_NODE(&notifier->link);
154         notifier->ops = ops;
155 }
156 
157 #endif
158 
159 #endif /* __LINUX_PREEMPT_H */
160 
  This page was automatically generated by the LXR engine.