Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 19349
b: refs/heads/master
c: 7978672
h: refs/heads/master
i:
  19347: eed07c6
v: v3
  • Loading branch information
George Anzinger authored and Linus Torvalds committed Feb 1, 2006
1 parent 60255be commit 8c8db58
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 68 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ff60a5dc4fa584d47022d2533bc5c53b80096fb5
refs/heads/master: 7978672c4d9a1e6a6081de3a9d9ba5e5b24904a0
5 changes: 2 additions & 3 deletions trunk/include/linux/hrtimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,8 @@ struct hrtimer_base {
/* Exported timer functions: */

/* Initialize timers: */
extern void hrtimer_init(struct hrtimer *timer, const clockid_t which_clock);
extern void hrtimer_rebase(struct hrtimer *timer, const clockid_t which_clock);

extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
enum hrtimer_mode mode);

/* Basic timer operations: */
extern int hrtimer_start(struct hrtimer *timer, ktime_t tim,
Expand Down
2 changes: 1 addition & 1 deletion trunk/kernel/fork.c
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
init_sigpending(&sig->shared_pending);
INIT_LIST_HEAD(&sig->posix_timers);

hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC);
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;
Expand Down
59 changes: 24 additions & 35 deletions trunk/kernel/hrtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,12 @@ EXPORT_SYMBOL_GPL(ktime_get_real);

/*
* The timer bases:
*
* Note: If we want to add new timer bases, we have to skip the two
* clock ids captured by the cpu-timers. We do this by holding empty
* entries rather than doing math adjustment of the clock ids.
* This ensures that we capture erroneous accesses to these clock ids
* rather than moving them into the range of valid clock id's.
*/

#define MAX_HRTIMER_BASES 2
Expand Down Expand Up @@ -483,29 +489,25 @@ ktime_t hrtimer_get_remaining(const struct hrtimer *timer)
}

/**
* hrtimer_rebase - rebase an initialized hrtimer to a different base
* hrtimer_init - initialize a timer to the given clock
*
* @timer: the timer to be rebased
* @timer: the timer to be initialized
* @clock_id: the clock to be used
* @mode: timer mode abs/rel
*/
void hrtimer_rebase(struct hrtimer *timer, const clockid_t clock_id)
void hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
enum hrtimer_mode mode)
{
struct hrtimer_base *bases;

memset(timer, 0, sizeof(struct hrtimer));

bases = per_cpu(hrtimer_bases, raw_smp_processor_id());
timer->base = &bases[clock_id];
}

/**
* hrtimer_init - initialize a timer to the given clock
*
* @timer: the timer to be initialized
* @clock_id: the clock to be used
*/
void hrtimer_init(struct hrtimer *timer, const clockid_t clock_id)
{
memset(timer, 0, sizeof(struct hrtimer));
hrtimer_rebase(timer, clock_id);
if (clock_id == CLOCK_REALTIME && mode != HRTIMER_ABS)
clock_id = CLOCK_MONOTONIC;

timer->base = &bases[clock_id];
}

/**
Expand Down Expand Up @@ -643,8 +645,7 @@ schedule_hrtimer_interruptible(struct hrtimer *timer,
return schedule_hrtimer(timer, mode);
}

static long __sched
nanosleep_restart(struct restart_block *restart, clockid_t clockid)
static long __sched nanosleep_restart(struct restart_block *restart)
{
struct timespec __user *rmtp;
struct timespec tu;
Expand All @@ -654,7 +655,7 @@ nanosleep_restart(struct restart_block *restart, clockid_t clockid)

restart->fn = do_no_restart_syscall;

hrtimer_init(&timer, clockid);
hrtimer_init(&timer, (clockid_t) restart->arg3, HRTIMER_ABS);

timer.expires.tv64 = ((u64)restart->arg1 << 32) | (u64) restart->arg0;

Expand All @@ -674,16 +675,6 @@ nanosleep_restart(struct restart_block *restart, clockid_t clockid)
return -ERESTART_RESTARTBLOCK;
}

static long __sched nanosleep_restart_mono(struct restart_block *restart)
{
return nanosleep_restart(restart, CLOCK_MONOTONIC);
}

static long __sched nanosleep_restart_real(struct restart_block *restart)
{
return nanosleep_restart(restart, CLOCK_REALTIME);
}

long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
const enum hrtimer_mode mode, const clockid_t clockid)
{
Expand All @@ -692,15 +683,15 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
struct timespec tu;
ktime_t rem;

hrtimer_init(&timer, clockid);
hrtimer_init(&timer, clockid, mode);

timer.expires = timespec_to_ktime(*rqtp);

rem = schedule_hrtimer_interruptible(&timer, mode);
if (rem.tv64 <= 0)
return 0;

/* Absolute timers do not update the rmtp value: */
/* Absolute timers do not update the rmtp value and restart: */
if (mode == HRTIMER_ABS)
return -ERESTARTNOHAND;

Expand All @@ -710,11 +701,11 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
return -EFAULT;

restart = &current_thread_info()->restart_block;
restart->fn = (clockid == CLOCK_MONOTONIC) ?
nanosleep_restart_mono : nanosleep_restart_real;
restart->fn = nanosleep_restart;
restart->arg0 = timer.expires.tv64 & 0xFFFFFFFF;
restart->arg1 = timer.expires.tv64 >> 32;
restart->arg2 = (unsigned long) rmtp;
restart->arg3 = (unsigned long) timer.base->index;

return -ERESTART_RESTARTBLOCK;
}
Expand All @@ -741,10 +732,8 @@ static void __devinit init_hrtimers_cpu(int cpu)
struct hrtimer_base *base = per_cpu(hrtimer_bases, cpu);
int i;

for (i = 0; i < MAX_HRTIMER_BASES; i++) {
for (i = 0; i < MAX_HRTIMER_BASES; i++, base++)
spin_lock_init(&base->lock);
base++;
}
}

#ifdef CONFIG_HOTPLUG_CPU
Expand Down
37 changes: 9 additions & 28 deletions trunk/kernel/posix-timers.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,9 +194,7 @@ static inline int common_clock_set(const clockid_t which_clock,

static int common_timer_create(struct k_itimer *new_timer)
{
hrtimer_init(&new_timer->it.real.timer, new_timer->it_clock);
new_timer->it.real.timer.data = new_timer;
new_timer->it.real.timer.function = posix_timer_fn;
hrtimer_init(&new_timer->it.real.timer, new_timer->it_clock, 0);
return 0;
}

Expand Down Expand Up @@ -693,6 +691,7 @@ common_timer_set(struct k_itimer *timr, int flags,
struct itimerspec *new_setting, struct itimerspec *old_setting)
{
struct hrtimer *timer = &timr->it.real.timer;
enum hrtimer_mode mode;

if (old_setting)
common_timer_get(timr, old_setting);
Expand All @@ -714,14 +713,10 @@ common_timer_set(struct k_itimer *timr, int flags,
if (!new_setting->it_value.tv_sec && !new_setting->it_value.tv_nsec)
return 0;

/* Posix madness. Only absolute CLOCK_REALTIME timers
* are affected by clock sets. So we must reiniatilize
* the timer.
*/
if (timr->it_clock == CLOCK_REALTIME && (flags & TIMER_ABSTIME))
hrtimer_rebase(timer, CLOCK_REALTIME);
else
hrtimer_rebase(timer, CLOCK_MONOTONIC);
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 All @@ -732,8 +727,7 @@ common_timer_set(struct k_itimer *timr, int flags,
if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE))
return 0;

hrtimer_start(timer, timer->expires, (flags & TIMER_ABSTIME) ?
HRTIMER_ABS : HRTIMER_REL);
hrtimer_start(timer, timer->expires, mode);
return 0;
}

Expand Down Expand Up @@ -948,21 +942,8 @@ sys_clock_getres(const clockid_t which_clock, struct timespec __user *tp)
static int common_nsleep(const clockid_t which_clock, int flags,
struct timespec *tsave, struct timespec __user *rmtp)
{
int mode = flags & TIMER_ABSTIME ? HRTIMER_ABS : HRTIMER_REL;
int clockid = which_clock;

switch (which_clock) {
case CLOCK_REALTIME:
/* Posix madness. Only absolute timers on clock realtime
are affected by clock set. */
if (mode != HRTIMER_ABS)
clockid = CLOCK_MONOTONIC;
case CLOCK_MONOTONIC:
break;
default:
return -EINVAL;
}
return hrtimer_nanosleep(tsave, rmtp, mode, clockid);
return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ?
HRTIMER_ABS : HRTIMER_REL, which_clock);
}

asmlinkage long
Expand Down

0 comments on commit 8c8db58

Please sign in to comment.