Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
661dd5c8
Commit
661dd5c8
authored
Jan 12, 2006
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/tglx/hrtimer-2.6
parents
45bfe98b
c9db4fa1
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
25 additions
and
25 deletions
+25
-25
include/linux/hrtimer.h
include/linux/hrtimer.h
+4
-8
include/linux/ktime.h
include/linux/ktime.h
+2
-2
kernel/hrtimer.c
kernel/hrtimer.c
+19
-15
No files found.
include/linux/hrtimer.h
View file @
661dd5c8
...
@@ -49,8 +49,6 @@ struct hrtimer_base;
...
@@ -49,8 +49,6 @@ struct hrtimer_base;
* struct hrtimer - the basic hrtimer structure
* struct hrtimer - the basic hrtimer structure
*
*
* @node: red black tree node for time ordered insertion
* @node: red black tree node for time ordered insertion
* @list: list head for easier access to the time ordered list,
* without walking the red black tree.
* @expires: the absolute expiry time in the hrtimers internal
* @expires: the absolute expiry time in the hrtimers internal
* representation. The time is related to the clock on
* representation. The time is related to the clock on
* which the timer is based.
* which the timer is based.
...
@@ -63,7 +61,6 @@ struct hrtimer_base;
...
@@ -63,7 +61,6 @@ struct hrtimer_base;
*/
*/
struct
hrtimer
{
struct
hrtimer
{
struct
rb_node
node
;
struct
rb_node
node
;
struct
list_head
list
;
ktime_t
expires
;
ktime_t
expires
;
enum
hrtimer_state
state
;
enum
hrtimer_state
state
;
int
(
*
function
)(
void
*
);
int
(
*
function
)(
void
*
);
...
@@ -78,7 +75,7 @@ struct hrtimer {
...
@@ -78,7 +75,7 @@ struct hrtimer {
* to a base on another cpu.
* to a base on another cpu.
* @lock: lock protecting the base and associated timers
* @lock: lock protecting the base and associated timers
* @active: red black tree root node for the active timers
* @active: red black tree root node for the active timers
* @
pending: list of pending timers for simple time ordered access
* @
first: pointer to the timer node which expires first
* @resolution: the resolution of the clock, in nanoseconds
* @resolution: the resolution of the clock, in nanoseconds
* @get_time: function to retrieve the current time of the clock
* @get_time: function to retrieve the current time of the clock
* @curr_timer: the timer which is executing a callback right now
* @curr_timer: the timer which is executing a callback right now
...
@@ -87,8 +84,8 @@ struct hrtimer_base {
...
@@ -87,8 +84,8 @@ struct hrtimer_base {
clockid_t
index
;
clockid_t
index
;
spinlock_t
lock
;
spinlock_t
lock
;
struct
rb_root
active
;
struct
rb_root
active
;
struct
list_head
pending
;
struct
rb_node
*
first
;
unsigned
long
resolution
;
ktime_t
resolution
;
ktime_t
(
*
get_time
)(
void
);
ktime_t
(
*
get_time
)(
void
);
struct
hrtimer
*
curr_timer
;
struct
hrtimer
*
curr_timer
;
};
};
...
@@ -125,8 +122,7 @@ static inline int hrtimer_active(const struct hrtimer *timer)
...
@@ -125,8 +122,7 @@ static inline int hrtimer_active(const struct hrtimer *timer)
}
}
/* Forward a hrtimer so it expires after now: */
/* Forward a hrtimer so it expires after now: */
extern
unsigned
long
hrtimer_forward
(
struct
hrtimer
*
timer
,
extern
unsigned
long
hrtimer_forward
(
struct
hrtimer
*
timer
,
ktime_t
interval
);
const
ktime_t
interval
);
/* Precise sleep: */
/* Precise sleep: */
extern
long
hrtimer_nanosleep
(
struct
timespec
*
rqtp
,
extern
long
hrtimer_nanosleep
(
struct
timespec
*
rqtp
,
...
...
include/linux/ktime.h
View file @
661dd5c8
...
@@ -272,8 +272,8 @@ static inline u64 ktime_to_ns(const ktime_t kt)
...
@@ -272,8 +272,8 @@ static inline u64 ktime_to_ns(const ktime_t kt)
* idea of the (in)accuracy of timers. Timer values are rounded up to
* idea of the (in)accuracy of timers. Timer values are rounded up to
* this resolution values.
* this resolution values.
*/
*/
#define KTIME_REALTIME_RES (
NSEC_PER_SEC/HZ)
#define KTIME_REALTIME_RES (
ktime_t){ .tv64 = TICK_NSEC }
#define KTIME_MONOTONIC_RES (
NSEC_PER_SEC/HZ)
#define KTIME_MONOTONIC_RES (
ktime_t){ .tv64 = TICK_NSEC }
/* Get the monotonic time in timespec format: */
/* Get the monotonic time in timespec format: */
extern
void
ktime_get_ts
(
struct
timespec
*
ts
);
extern
void
ktime_get_ts
(
struct
timespec
*
ts
);
...
...
kernel/hrtimer.c
View file @
661dd5c8
...
@@ -275,7 +275,7 @@ void unlock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
...
@@ -275,7 +275,7 @@ void unlock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
* The number of overruns is added to the overrun field.
* The number of overruns is added to the overrun field.
*/
*/
unsigned
long
unsigned
long
hrtimer_forward
(
struct
hrtimer
*
timer
,
const
ktime_t
interval
)
hrtimer_forward
(
struct
hrtimer
*
timer
,
ktime_t
interval
)
{
{
unsigned
long
orun
=
1
;
unsigned
long
orun
=
1
;
ktime_t
delta
,
now
;
ktime_t
delta
,
now
;
...
@@ -287,6 +287,9 @@ hrtimer_forward(struct hrtimer *timer, const ktime_t interval)
...
@@ -287,6 +287,9 @@ hrtimer_forward(struct hrtimer *timer, const ktime_t interval)
if
(
delta
.
tv64
<
0
)
if
(
delta
.
tv64
<
0
)
return
0
;
return
0
;
if
(
interval
.
tv64
<
timer
->
base
->
resolution
.
tv64
)
interval
.
tv64
=
timer
->
base
->
resolution
.
tv64
;
if
(
unlikely
(
delta
.
tv64
>=
interval
.
tv64
))
{
if
(
unlikely
(
delta
.
tv64
>=
interval
.
tv64
))
{
nsec_t
incr
=
ktime_to_ns
(
interval
);
nsec_t
incr
=
ktime_to_ns
(
interval
);
...
@@ -314,7 +317,6 @@ hrtimer_forward(struct hrtimer *timer, const ktime_t interval)
...
@@ -314,7 +317,6 @@ hrtimer_forward(struct hrtimer *timer, const ktime_t interval)
static
void
enqueue_hrtimer
(
struct
hrtimer
*
timer
,
struct
hrtimer_base
*
base
)
static
void
enqueue_hrtimer
(
struct
hrtimer
*
timer
,
struct
hrtimer_base
*
base
)
{
{
struct
rb_node
**
link
=
&
base
->
active
.
rb_node
;
struct
rb_node
**
link
=
&
base
->
active
.
rb_node
;
struct
list_head
*
prev
=
&
base
->
pending
;
struct
rb_node
*
parent
=
NULL
;
struct
rb_node
*
parent
=
NULL
;
struct
hrtimer
*
entry
;
struct
hrtimer
*
entry
;
...
@@ -330,22 +332,23 @@ static void enqueue_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
...
@@ -330,22 +332,23 @@ static void enqueue_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
*/
*/
if
(
timer
->
expires
.
tv64
<
entry
->
expires
.
tv64
)
if
(
timer
->
expires
.
tv64
<
entry
->
expires
.
tv64
)
link
=
&
(
*
link
)
->
rb_left
;
link
=
&
(
*
link
)
->
rb_left
;
else
{
else
link
=
&
(
*
link
)
->
rb_right
;
link
=
&
(
*
link
)
->
rb_right
;
prev
=
&
entry
->
list
;
}
}
}
/*
/*
* Insert the timer to the rbtree and to the sorted list:
* Insert the timer to the rbtree and check whether it
* replaces the first pending timer
*/
*/
rb_link_node
(
&
timer
->
node
,
parent
,
link
);
rb_link_node
(
&
timer
->
node
,
parent
,
link
);
rb_insert_color
(
&
timer
->
node
,
&
base
->
active
);
rb_insert_color
(
&
timer
->
node
,
&
base
->
active
);
list_add
(
&
timer
->
list
,
prev
);
timer
->
state
=
HRTIMER_PENDING
;
timer
->
state
=
HRTIMER_PENDING
;
}
if
(
!
base
->
first
||
timer
->
expires
.
tv64
<
rb_entry
(
base
->
first
,
struct
hrtimer
,
node
)
->
expires
.
tv64
)
base
->
first
=
&
timer
->
node
;
}
/*
/*
* __remove_hrtimer - internal function to remove a timer
* __remove_hrtimer - internal function to remove a timer
...
@@ -355,9 +358,11 @@ static void enqueue_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
...
@@ -355,9 +358,11 @@ static void enqueue_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
static
void
__remove_hrtimer
(
struct
hrtimer
*
timer
,
struct
hrtimer_base
*
base
)
static
void
__remove_hrtimer
(
struct
hrtimer
*
timer
,
struct
hrtimer_base
*
base
)
{
{
/*
/*
* Remove the timer from the sorted list and from the rbtree:
* Remove the timer from the rbtree and replace the
* first entry pointer if necessary.
*/
*/
list_del
(
&
timer
->
list
);
if
(
base
->
first
==
&
timer
->
node
)
base
->
first
=
rb_next
(
&
timer
->
node
);
rb_erase
(
&
timer
->
node
,
&
base
->
active
);
rb_erase
(
&
timer
->
node
,
&
base
->
active
);
}
}
...
@@ -516,9 +521,8 @@ int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp)
...
@@ -516,9 +521,8 @@ int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp)
{
{
struct
hrtimer_base
*
bases
;
struct
hrtimer_base
*
bases
;
tp
->
tv_sec
=
0
;
bases
=
per_cpu
(
hrtimer_bases
,
raw_smp_processor_id
());
bases
=
per_cpu
(
hrtimer_bases
,
raw_smp_processor_id
());
tp
->
tv_nsec
=
bases
[
which_clock
].
resolution
;
*
tp
=
ktime_to_timespec
(
bases
[
which_clock
].
resolution
)
;
return
0
;
return
0
;
}
}
...
@@ -529,16 +533,17 @@ int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp)
...
@@ -529,16 +533,17 @@ int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp)
static
inline
void
run_hrtimer_queue
(
struct
hrtimer_base
*
base
)
static
inline
void
run_hrtimer_queue
(
struct
hrtimer_base
*
base
)
{
{
ktime_t
now
=
base
->
get_time
();
ktime_t
now
=
base
->
get_time
();
struct
rb_node
*
node
;
spin_lock_irq
(
&
base
->
lock
);
spin_lock_irq
(
&
base
->
lock
);
while
(
!
list_empty
(
&
base
->
pending
))
{
while
(
(
node
=
base
->
first
))
{
struct
hrtimer
*
timer
;
struct
hrtimer
*
timer
;
int
(
*
fn
)(
void
*
);
int
(
*
fn
)(
void
*
);
int
restart
;
int
restart
;
void
*
data
;
void
*
data
;
timer
=
list_entry
(
base
->
pending
.
next
,
struct
hrtimer
,
list
);
timer
=
rb_entry
(
node
,
struct
hrtimer
,
node
);
if
(
now
.
tv64
<=
timer
->
expires
.
tv64
)
if
(
now
.
tv64
<=
timer
->
expires
.
tv64
)
break
;
break
;
...
@@ -732,7 +737,6 @@ static void __devinit init_hrtimers_cpu(int cpu)
...
@@ -732,7 +737,6 @@ static void __devinit init_hrtimers_cpu(int cpu)
for
(
i
=
0
;
i
<
MAX_HRTIMER_BASES
;
i
++
)
{
for
(
i
=
0
;
i
<
MAX_HRTIMER_BASES
;
i
++
)
{
spin_lock_init
(
&
base
->
lock
);
spin_lock_init
(
&
base
->
lock
);
INIT_LIST_HEAD
(
&
base
->
pending
);
base
++
;
base
++
;
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment