Skip to content

Commit

Permalink
[PATCH] hrtimers: remove data field
Browse files Browse the repository at this point in the history
The nanosleep cleanup allows to remove the data field of hrtimer.  The
callback function can use container_of() to get it's own data.  Since the
hrtimer structure is anyway embedded in other structures, this adds no
overhead.

Signed-off-by: Roman Zippel <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Roman Zippel authored and Linus Torvalds committed Mar 26, 2006
1 parent df869b6 commit 05cfb61
Show file tree
Hide file tree
Showing 8 changed files with 22 additions and 27 deletions.
2 changes: 1 addition & 1 deletion fs/exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -632,7 +632,7 @@ static int de_thread(struct task_struct *tsk)
* synchronize with any firing (by calling del_timer_sync)
* before we can safely let the old group leader die.
*/
sig->real_timer.data = current;
sig->tsk = current;
spin_unlock_irq(lock);
if (hrtimer_cancel(&sig->real_timer))
hrtimer_restart(&sig->real_timer);
Expand Down
5 changes: 1 addition & 4 deletions include/linux/hrtimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,15 @@ struct hrtimer_base;
* @expires: the absolute expiry time in the hrtimers internal
* representation. The time is related to the clock on
* which the timer is based.
* @state: state of the timer
* @function: timer expiry callback function
* @data: argument for the callback function
* @base: pointer to the timer base (per cpu and per clock)
*
* The hrtimer structure must be initialized by init_hrtimer_#CLOCKTYPE()
*/
struct hrtimer {
struct rb_node node;
ktime_t expires;
int (*function)(void *);
void *data;
int (*function)(struct hrtimer *);
struct hrtimer_base *base;
};

Expand Down
1 change: 1 addition & 0 deletions include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,7 @@ struct signal_struct {

/* ITIMER_REAL timer for the process */
struct hrtimer real_timer;
struct task_struct *tsk;
ktime_t it_real_incr;

/* ITIMER_PROF and ITIMER_VIRTUAL timers for the process */
Expand Down
3 changes: 2 additions & 1 deletion include/linux/timer.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ static inline void add_timer(struct timer_list *timer)

extern void init_timers(void);
extern void run_local_timers(void);
extern int it_real_fn(void *);
struct hrtimer;
extern int it_real_fn(struct hrtimer *);

#endif
2 changes: 1 addition & 1 deletion kernel/fork.c
Original file line number Diff line number Diff line change
Expand Up @@ -848,7 +848,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC, HRTIMER_REL);
sig->it_real_incr.tv64 = 0;
sig->real_timer.function = it_real_fn;
sig->real_timer.data = tsk;
sig->tsk = tsk;

sig->it_virt_expires = cputime_zero;
sig->it_virt_incr = cputime_zero;
Expand Down
12 changes: 5 additions & 7 deletions kernel/hrtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -613,21 +613,19 @@ static inline void run_hrtimer_queue(struct hrtimer_base *base)

while ((node = base->first)) {
struct hrtimer *timer;
int (*fn)(void *);
int (*fn)(struct hrtimer *);
int restart;
void *data;

timer = rb_entry(node, struct hrtimer, node);
if (base->softirq_time.tv64 <= timer->expires.tv64)
break;

fn = timer->function;
data = timer->data;
set_curr_timer(base, timer);
__remove_hrtimer(timer, base);
spin_unlock_irq(&base->lock);

restart = fn(data);
restart = fn(timer);

spin_lock_irq(&base->lock);

Expand Down Expand Up @@ -664,9 +662,10 @@ struct sleep_hrtimer {
int expired;
};

static int nanosleep_wakeup(void *data)
static int nanosleep_wakeup(struct hrtimer *timer)
{
struct sleep_hrtimer *t = data;
struct sleep_hrtimer *t =
container_of(timer, struct sleep_hrtimer, timer);

t->expired = 1;
wake_up_process(t->task);
Expand All @@ -677,7 +676,6 @@ static int nanosleep_wakeup(void *data)
static int __sched do_nanosleep(struct sleep_hrtimer *t, enum hrtimer_mode mode)
{
t->timer.function = nanosleep_wakeup;
t->timer.data = t;
t->task = current;
t->expired = 0;

Expand Down
15 changes: 7 additions & 8 deletions kernel/itimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,17 +128,16 @@ asmlinkage long sys_getitimer(int which, struct itimerval __user *value)
/*
* The timer is automagically restarted, when interval != 0
*/
int it_real_fn(void *data)
int it_real_fn(struct hrtimer *timer)
{
struct task_struct *tsk = (struct task_struct *) data;
struct signal_struct *sig =
container_of(timer, struct signal_struct, real_timer);

send_group_sig_info(SIGALRM, SEND_SIG_PRIV, tsk);

if (tsk->signal->it_real_incr.tv64 != 0) {
hrtimer_forward(&tsk->signal->real_timer,
tsk->signal->real_timer.base->softirq_time,
tsk->signal->it_real_incr);
send_group_sig_info(SIGALRM, SEND_SIG_PRIV, sig->tsk);

if (sig->it_real_incr.tv64 != 0) {
hrtimer_forward(timer, timer->base->softirq_time,
sig->it_real_incr);
return HRTIMER_RESTART;
}
return HRTIMER_NORESTART;
Expand Down
9 changes: 4 additions & 5 deletions kernel/posix-timers.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ static int common_timer_set(struct k_itimer *, int,
struct itimerspec *, struct itimerspec *);
static int common_timer_del(struct k_itimer *timer);

static int posix_timer_fn(void *data);
static int posix_timer_fn(struct hrtimer *data);

static struct k_itimer *lock_timer(timer_t timer_id, unsigned long *flags);

Expand Down Expand Up @@ -334,14 +334,14 @@ EXPORT_SYMBOL_GPL(posix_timer_event);
* This code is for CLOCK_REALTIME* and CLOCK_MONOTONIC* timers.
*/
static int posix_timer_fn(void *data)
static int posix_timer_fn(struct hrtimer *timer)
{
struct k_itimer *timr = data;
struct hrtimer *timer = &timr->it.real.timer;
struct k_itimer *timr;
unsigned long flags;
int si_private = 0;
int ret = HRTIMER_NORESTART;

timr = container_of(timer, struct k_itimer, it.real.timer);
spin_lock_irqsave(&timr->it_lock, flags);

if (timr->it.real.interval.tv64 != 0)
Expand Down Expand Up @@ -725,7 +725,6 @@ common_timer_set(struct k_itimer *timr, int flags,

mode = flags & TIMER_ABSTIME ? HRTIMER_ABS : HRTIMER_REL;
hrtimer_init(&timr->it.real.timer, timr->it_clock, mode);
timr->it.real.timer.data = timr;
timr->it.real.timer.function = posix_timer_fn;

timer->expires = timespec_to_ktime(new_setting->it_value);
Expand Down

0 comments on commit 05cfb61

Please sign in to comment.