aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2007-02-16 04:27:50 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-16 11:13:58 -0500
commit3c8aa39d7c445ae2612b6b626f76f077e7a7ab0d (patch)
tree8e07fc3dbddc0d5a8be3ecda491ec4410c90ed6b /include/linux
parentc9cb2e3d7c9178ab75d0942f96abb3abe0369906 (diff)
[PATCH] hrtimers: cleanup locking
Improve kernel/hrtimers.c locking: use a per-CPU base with a lock to control locking of all clocks belonging to a CPU. This simplifies code that needs to lock all clocks at once. This makes life easier for high-res timers and dyntick. No functional changes. [ optimization change from Andrew Morton <akpm@osdl.org> ] Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Cc: john stultz <johnstul@us.ibm.com> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/hrtimer.h43
1 files changed, 28 insertions, 15 deletions
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
index 44c7d280b1a5..e00fc4d3d74f 100644
--- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h
@@ -21,6 +21,9 @@
21#include <linux/list.h> 21#include <linux/list.h>
22#include <linux/wait.h> 22#include <linux/wait.h>
23 23
24struct hrtimer_clock_base;
25struct hrtimer_cpu_base;
26
24/* 27/*
25 * Mode arguments of xxx_hrtimer functions: 28 * Mode arguments of xxx_hrtimer functions:
26 */ 29 */
@@ -37,8 +40,6 @@ enum hrtimer_restart {
37 HRTIMER_RESTART, /* Timer must be restarted */ 40 HRTIMER_RESTART, /* Timer must be restarted */
38}; 41};
39 42
40struct hrtimer_base;
41
42/** 43/**
43 * struct hrtimer - the basic hrtimer structure 44 * struct hrtimer - the basic hrtimer structure
44 * @node: red black tree node for time ordered insertion 45 * @node: red black tree node for time ordered insertion
@@ -51,10 +52,10 @@ struct hrtimer_base;
51 * The hrtimer structure must be initialized by init_hrtimer_#CLOCKTYPE() 52 * The hrtimer structure must be initialized by init_hrtimer_#CLOCKTYPE()
52 */ 53 */
53struct hrtimer { 54struct hrtimer {
54 struct rb_node node; 55 struct rb_node node;
55 ktime_t expires; 56 ktime_t expires;
56 enum hrtimer_restart (*function)(struct hrtimer *); 57 enum hrtimer_restart (*function)(struct hrtimer *);
57 struct hrtimer_base *base; 58 struct hrtimer_clock_base *base;
58}; 59};
59 60
60/** 61/**
@@ -71,29 +72,41 @@ struct hrtimer_sleeper {
71 72
72/** 73/**
73 * struct hrtimer_base - the timer base for a specific clock 74 * struct hrtimer_base - the timer base for a specific clock
74 * @index: clock type index for per_cpu support when moving a timer 75 * @index: clock type index for per_cpu support when moving a
75 * to a base on another cpu. 76 * timer to a base on another cpu.
76 * @lock: lock protecting the base and associated timers
77 * @active: red black tree root node for the active timers 77 * @active: red black tree root node for the active timers
78 * @first: pointer to the timer node which expires first 78 * @first: pointer to the timer node which expires first
79 * @resolution: the resolution of the clock, in nanoseconds 79 * @resolution: the resolution of the clock, in nanoseconds
80 * @get_time: function to retrieve the current time of the clock 80 * @get_time: function to retrieve the current time of the clock
81 * @get_softirq_time: function to retrieve the current time from the softirq 81 * @get_softirq_time: function to retrieve the current time from the softirq
82 * @curr_timer: the timer which is executing a callback right now
83 * @softirq_time: the time when running the hrtimer queue in the softirq 82 * @softirq_time: the time when running the hrtimer queue in the softirq
84 * @lock_key: the lock_class_key for use with lockdep
85 */ 83 */
86struct hrtimer_base { 84struct hrtimer_clock_base {
85 struct hrtimer_cpu_base *cpu_base;
87 clockid_t index; 86 clockid_t index;
88 spinlock_t lock;
89 struct rb_root active; 87 struct rb_root active;
90 struct rb_node *first; 88 struct rb_node *first;
91 ktime_t resolution; 89 ktime_t resolution;
92 ktime_t (*get_time)(void); 90 ktime_t (*get_time)(void);
93 ktime_t (*get_softirq_time)(void); 91 ktime_t (*get_softirq_time)(void);
94 struct hrtimer *curr_timer;
95 ktime_t softirq_time; 92 ktime_t softirq_time;
96 struct lock_class_key lock_key; 93};
94
95#define HRTIMER_MAX_CLOCK_BASES 2
96
97/*
98 * struct hrtimer_cpu_base - the per cpu clock bases
99 * @lock: lock protecting the base and associated clock bases
100 * and timers
101 * @lock_key: the lock_class_key for use with lockdep
102 * @clock_base: array of clock bases for this cpu
103 * @curr_timer: the timer which is executing a callback right now
104 */
105struct hrtimer_cpu_base {
106 spinlock_t lock;
107 struct lock_class_key lock_key;
108 struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES];
109 struct hrtimer *curr_timer;
97}; 110};
98 111
99/* 112/*