mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 21:21:09 +00:00
[PATCH] sched: arch preempt notifier mechanism
This adds a general mechanism whereby a task can request the scheduler to notify it whenever it is preempted or scheduled back in. This allows the task to swap any special-purpose registers like the fpu or Intel's VT registers. Signed-off-by: Avi Kivity <avi@qumranet.com> [ mingo@elte.hu: fixes, cleanups ] Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
b47e8608a0
commit
e107be36ef
4 changed files with 123 additions and 2 deletions
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <linux/thread_info.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
#ifdef CONFIG_DEBUG_PREEMPT
|
||||
extern void fastcall add_preempt_count(int val);
|
||||
|
@ -60,4 +61,47 @@ do { \
|
|||
|
||||
#endif
|
||||
|
||||
#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
|
||||
*/
|
||||
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(¬ifier->link);
|
||||
notifier->ops = ops;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __LINUX_PREEMPT_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue