Blame view

include/linux/preempt.h 3.79 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
  #ifndef __LINUX_PREEMPT_H
  #define __LINUX_PREEMPT_H
  
  /*
   * include/linux/preempt.h - macros for accessing and manipulating
   * preempt_count (used for kernel preemption, interrupt count, etc.)
   */
f037360f2   Al Viro   [PATCH] m68k: thr...
8
  #include <linux/thread_info.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
  #include <linux/linkage.h>
e107be36e   Avi Kivity   [PATCH] sched: ar...
10
  #include <linux/list.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11

6cd8a4bb2   Steven Rostedt   ftrace: trace pre...
12
  #if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER)
ec7015840   Harvey Harrison   Remove fastcall f...
13
14
    extern void add_preempt_count(int val);
    extern void sub_preempt_count(int val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  #else
  # define add_preempt_count(val)	do { preempt_count() += (val); } while (0)
  # define sub_preempt_count(val)	do { preempt_count() -= (val); } while (0)
  #endif
  
  #define inc_preempt_count() add_preempt_count(1)
  #define dec_preempt_count() sub_preempt_count(1)
  
  #define preempt_count()	(current_thread_info()->preempt_count)
  
  #ifdef CONFIG_PREEMPT
  
  asmlinkage void preempt_schedule(void);
  
  #define preempt_disable() \
  do { \
  	inc_preempt_count(); \
  	barrier(); \
  } while (0)
  
  #define preempt_enable_no_resched() \
  do { \
  	barrier(); \
  	dec_preempt_count(); \
  } while (0)
  
  #define preempt_check_resched() \
  do { \
  	if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \
  		preempt_schedule(); \
  } while (0)
  
  #define preempt_enable() \
  do { \
  	preempt_enable_no_resched(); \
d6f029130   Nicolas Pitre   [PATCH] fix race ...
50
  	barrier(); \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
  	preempt_check_resched(); \
  } while (0)
502825282   Steven Rostedt   ftrace: add preem...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  /* For debugging and tracer internals only! */
  #define add_preempt_count_notrace(val)			\
  	do { preempt_count() += (val); } while (0)
  #define sub_preempt_count_notrace(val)			\
  	do { preempt_count() -= (val); } while (0)
  #define inc_preempt_count_notrace() add_preempt_count_notrace(1)
  #define dec_preempt_count_notrace() sub_preempt_count_notrace(1)
  
  #define preempt_disable_notrace() \
  do { \
  	inc_preempt_count_notrace(); \
  	barrier(); \
  } while (0)
  
  #define preempt_enable_no_resched_notrace() \
  do { \
  	barrier(); \
  	dec_preempt_count_notrace(); \
  } while (0)
  
  /* preempt_check_resched is OK to trace */
  #define preempt_enable_notrace() \
  do { \
  	preempt_enable_no_resched_notrace(); \
  	barrier(); \
  	preempt_check_resched(); \
  } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
83
84
85
  #else
  
  #define preempt_disable()		do { } while (0)
  #define preempt_enable_no_resched()	do { } while (0)
  #define preempt_enable()		do { } while (0)
  #define preempt_check_resched()		do { } while (0)
502825282   Steven Rostedt   ftrace: add preem...
86
87
88
  #define preempt_disable_notrace()		do { } while (0)
  #define preempt_enable_no_resched_notrace()	do { } while (0)
  #define preempt_enable_notrace()		do { } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
  #endif
e107be36e   Avi Kivity   [PATCH] sched: ar...
90
91
92
93
94
95
96
97
98
99
100
101
  #ifdef CONFIG_PREEMPT_NOTIFIERS
  
  struct preempt_notifier;
  
  /**
   * preempt_ops - notifiers called when a task is preempted and rescheduled
   * @sched_in: we're about to be rescheduled:
   *    notifier: struct preempt_notifier for the task being scheduled
   *    cpu:  cpu we're scheduled on
   * @sched_out: we've just been preempted
   *    notifier: struct preempt_notifier for the task being preempted
   *    next: the task that's kicking us out
8592e6486   Tejun Heo   sched: Revert 498...
102
103
104
105
106
   *
   * Please note that sched_in and out are called under different
   * contexts.  sched_out is called with rq lock held and irq disabled
   * while sched_in is called without rq lock and irq enabled.  This
   * difference is intentional and depended upon by its users.
e107be36e   Avi Kivity   [PATCH] sched: ar...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
   */
  struct preempt_ops {
  	void (*sched_in)(struct preempt_notifier *notifier, int cpu);
  	void (*sched_out)(struct preempt_notifier *notifier,
  			  struct task_struct *next);
  };
  
  /**
   * preempt_notifier - key for installing preemption notifiers
   * @link: internal use
   * @ops: defines the notifier functions to be called
   *
   * Usually used in conjunction with container_of().
   */
  struct preempt_notifier {
  	struct hlist_node link;
  	struct preempt_ops *ops;
  };
  
  void preempt_notifier_register(struct preempt_notifier *notifier);
  void preempt_notifier_unregister(struct preempt_notifier *notifier);
  
  static inline void preempt_notifier_init(struct preempt_notifier *notifier,
  				     struct preempt_ops *ops)
  {
  	INIT_HLIST_NODE(&notifier->link);
  	notifier->ops = ops;
  }
  
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
  #endif /* __LINUX_PREEMPT_H */