Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 150972
b: refs/heads/master
c: cd6d95d
h: refs/heads/master
v: v3
  • Loading branch information
Thomas Gleixner committed Jun 13, 2009
1 parent a902c5f commit 9c027b5
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 12 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: 3f68535adad8dd89499505a65fb25d0e02d118cc
refs/heads/master: cd6d95d8449b7c9f415f26041e9ae173d387b6bd
2 changes: 1 addition & 1 deletion trunk/include/linux/hrtimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ static inline int hrtimer_is_hres_active(struct hrtimer *timer)

extern ktime_t ktime_get(void);
extern ktime_t ktime_get_real(void);
extern int hrtimer_hres_active(void);


DECLARE_PER_CPU(struct tick_device, tick_cpu_device);

Expand Down
3 changes: 3 additions & 0 deletions trunk/include/linux/tick.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,12 @@ extern void tick_clock_notify(void);
extern int tick_check_oneshot_change(int allow_nohz);
extern struct tick_sched *tick_get_tick_sched(int cpu);
extern void tick_check_idle(int cpu);
extern int tick_oneshot_mode_active(void);
# else
static inline void tick_clock_notify(void) { }
static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
static inline void tick_check_idle(int cpu) { }
static inline int tick_oneshot_mode_active(void) { return 0; }
# endif

#else /* CONFIG_GENERIC_CLOCKEVENTS */
Expand All @@ -109,6 +111,7 @@ static inline void tick_cancel_sched_timer(int cpu) { }
static inline void tick_clock_notify(void) { }
static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
static inline void tick_check_idle(int cpu) { }
static inline int tick_oneshot_mode_active(void) { return 0; }
#endif /* !CONFIG_GENERIC_CLOCKEVENTS */

# ifdef CONFIG_NO_HZ
Expand Down
4 changes: 2 additions & 2 deletions trunk/kernel/hrtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ static inline int hrtimer_is_hres_enabled(void)
/*
* Is the high resolution mode active ?
*/
int hrtimer_hres_active(void)
static inline int hrtimer_hres_active(void)
{
return __get_cpu_var(hrtimer_bases).hres_active;
}
Expand Down Expand Up @@ -704,7 +704,7 @@ static int hrtimer_switch_to_hres(void)

#else

int hrtimer_hres_active(void) { return 0; }
static inline int hrtimer_hres_active(void) { return 0; }
static inline int hrtimer_is_hres_enabled(void) { return 0; }
static inline int hrtimer_switch_to_hres(void) { return 0; }
static inline void hrtimer_force_reprogram(struct hrtimer_cpu_base *base) { }
Expand Down
18 changes: 10 additions & 8 deletions trunk/kernel/time/clocksource.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
#include <linux/module.h>
#include <linux/sched.h> /* for spin_unlock_irq() using preempt_count() m68k */
#include <linux/tick.h>
#include <linux/hrtimer.h>

void timecounter_init(struct timecounter *tc,
const struct cyclecounter *cc,
Expand Down Expand Up @@ -511,13 +510,13 @@ static ssize_t sysfs_override_clocksource(struct sys_device *dev,
}

/*
* Check to make sure we don't switch to a non-HRT usable
* clocksource if HRT is enabled and running
* Check to make sure we don't switch to a non-highres capable
* clocksource if the tick code is in oneshot mode (highres or nohz)
*/
if (hrtimer_hres_active() &&
if (tick_oneshot_mode_active() &&
!(ovr->flags & CLOCK_SOURCE_VALID_FOR_HRES)) {
printk(KERN_WARNING "%s clocksource is not HRT compatible. "
"Cannot switch while in HRT mode\n", ovr->name);
"Cannot switch while in HRT/NOHZ mode\n", ovr->name);
ovr = NULL;
override_name[0] = 0;
}
Expand Down Expand Up @@ -550,9 +549,12 @@ sysfs_show_available_clocksources(struct sys_device *dev,

spin_lock_irq(&clocksource_lock);
list_for_each_entry(src, &clocksource_list, list) {
/* Don't show non-HRES clocksource if HRES is enabled */
if (!hrtimer_hres_active() ||
(src->flags & CLOCK_SOURCE_VALID_FOR_HRES))
/*
* Don't show non-HRES clocksource if the tick code is
* in one shot mode (highres=on or nohz=on)
*/
if (!tick_oneshot_mode_active() ||
(src->flags & CLOCK_SOURCE_VALID_FOR_HRES))
count += snprintf(buf + count,
max((ssize_t)PAGE_SIZE - count, (ssize_t)0),
"%s ", src->name);
Expand Down
17 changes: 17 additions & 0 deletions trunk/kernel/time/tick-oneshot.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,23 @@ int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *))
return 0;
}

/**
* tick_check_oneshot_mode - check whether the system is in oneshot mode
*
* returns 1 when either nohz or highres are enabled. otherwise 0.
*/
int tick_oneshot_mode_active(void)
{
unsigned long flags;
int ret;

local_irq_save(flags);
ret = __get_cpu_var(tick_cpu_device).mode == TICKDEV_MODE_ONESHOT;
local_irq_restore(flags);

return ret;
}

#ifdef CONFIG_HIGH_RES_TIMERS
/**
* tick_init_highres - switch to high resolution mode
Expand Down

0 comments on commit 9c027b5

Please sign in to comment.