~ubuntu-branches/ubuntu/trusty/apex/trusty

« back to all changes in this revision

Viewing changes to include/linux/preempt.h

  • Committer: Bazaar Package Importer
  • Author(s): Oliver Grawert
  • Date: 2009-11-10 11:55:15 UTC
  • mfrom: (2.2.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091110115515-6jjsf6rc8py35awe
Tags: 1.6.10ubuntu1
* Merge from debian testing, remaining changes:
  - Move apex VMA address to 4MiB to leave enough space for the ubuntu
  kernel and not overwrite apex in ram when loading.
  - nslu2 configuration: set CONFIG_RAMDISK_SIZE=0x0055FFF0 instead of
  0x005FFFF0 to make enough room for ubuntu initramfs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
13
#ifdef CONFIG_DEBUG_PREEMPT
 
14
  extern void add_preempt_count(int val);
 
15
  extern void sub_preempt_count(int val);
 
16
#else
 
17
# define add_preempt_count(val) do { preempt_count() += (val); } while (0)
 
18
# define sub_preempt_count(val) do { preempt_count() -= (val); } while (0)
 
19
#endif
 
20
 
 
21
#define inc_preempt_count() add_preempt_count(1)
 
22
#define dec_preempt_count() sub_preempt_count(1)
 
23
 
 
24
#define preempt_count() (current_thread_info()->preempt_count)
 
25
 
 
26
#ifdef CONFIG_PREEMPT
 
27
 
 
28
asmlinkage void preempt_schedule(void);
 
29
 
 
30
#define preempt_disable() \
 
31
do { \
 
32
        inc_preempt_count(); \
 
33
        barrier(); \
 
34
} while (0)
 
35
 
 
36
#define preempt_enable_no_resched() \
 
37
do { \
 
38
        barrier(); \
 
39
        dec_preempt_count(); \
 
40
} while (0)
 
41
 
 
42
#define preempt_check_resched() \
 
43
do { \
 
44
        if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \
 
45
                preempt_schedule(); \
 
46
} while (0)
 
47
 
 
48
#define preempt_enable() \
 
49
do { \
 
50
        preempt_enable_no_resched(); \
 
51
        barrier(); \
 
52
        preempt_check_resched(); \
 
53
} while (0)
 
54
 
 
55
#else
 
56
 
 
57
#define preempt_disable()               do { } while (0)
 
58
#define preempt_enable_no_resched()     do { } while (0)
 
59
#define preempt_enable()                do { } while (0)
 
60
#define preempt_check_resched()         do { } while (0)
 
61
 
 
62
#endif
 
63
 
 
64
#ifdef CONFIG_PREEMPT_NOTIFIERS
 
65
 
 
66
struct preempt_notifier;
 
67
 
 
68
/**
 
69
 * preempt_ops - notifiers called when a task is preempted and rescheduled
 
70
 * @sched_in: we're about to be rescheduled:
 
71
 *    notifier: struct preempt_notifier for the task being scheduled
 
72
 *    cpu:  cpu we're scheduled on
 
73
 * @sched_out: we've just been preempted
 
74
 *    notifier: struct preempt_notifier for the task being preempted
 
75
 *    next: the task that's kicking us out
 
76
 */
 
77
struct preempt_ops {
 
78
        void (*sched_in)(struct preempt_notifier *notifier, int cpu);
 
79
        void (*sched_out)(struct preempt_notifier *notifier,
 
80
                          struct task_struct *next);
 
81
};
 
82
 
 
83
/**
 
84
 * preempt_notifier - key for installing preemption notifiers
 
85
 * @link: internal use
 
86
 * @ops: defines the notifier functions to be called
 
87
 *
 
88
 * Usually used in conjunction with container_of().
 
89
 */
 
90
struct preempt_notifier {
 
91
        struct hlist_node link;
 
92
        struct preempt_ops *ops;
 
93
};
 
94
 
 
95
void preempt_notifier_register(struct preempt_notifier *notifier);
 
96
void preempt_notifier_unregister(struct preempt_notifier *notifier);
 
97
 
 
98
static inline void preempt_notifier_init(struct preempt_notifier *notifier,
 
99
                                     struct preempt_ops *ops)
 
100
{
 
101
        INIT_HLIST_NODE(&notifier->link);
 
102
        notifier->ops = ops;
 
103
}
 
104
 
 
105
#endif
 
106
 
 
107
#endif /* __LINUX_PREEMPT_H */