Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 109642
b: refs/heads/master
c: 1fb9b7d
h: refs/heads/master
v: v3
  • Loading branch information
Thomas Gleixner committed Sep 5, 2008
1 parent 4c2d436 commit 60a4ab5
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 17 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: 9c17bcda991000351cb2373f78be7e4b1c44caa3
refs/heads/master: 1fb9b7d29d8e85ba3196eaa7ab871bf76fc98d36
12 changes: 2 additions & 10 deletions trunk/kernel/time/tick-broadcast.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,16 +372,8 @@ cpumask_t *tick_get_broadcast_oneshot_mask(void)
static int tick_broadcast_set_event(ktime_t expires, int force)
{
struct clock_event_device *bc = tick_broadcast_device.evtdev;
ktime_t now = ktime_get();
int res;

for(;;) {
res = clockevents_program_event(bc, expires, now);
if (!res || !force)
return res;
now = ktime_get();
expires = ktime_add(now, ktime_set(0, bc->min_delta_ns));
}

return tick_dev_program_event(bc, expires, force);
}

int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
Expand Down
2 changes: 2 additions & 0 deletions trunk/kernel/time/tick-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ extern void tick_handle_periodic(struct clock_event_device *dev);
extern void tick_setup_oneshot(struct clock_event_device *newdev,
void (*handler)(struct clock_event_device *),
ktime_t nextevt);
extern int tick_dev_program_event(struct clock_event_device *dev,
ktime_t expires, int force);
extern int tick_program_event(ktime_t expires, int force);
extern void tick_oneshot_notify(void);
extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *));
Expand Down
36 changes: 30 additions & 6 deletions trunk/kernel/time/tick-oneshot.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,42 @@
/**
* tick_program_event internal worker function
*/
static int __tick_program_event(struct clock_event_device *dev,
ktime_t expires, int force)
int tick_dev_program_event(struct clock_event_device *dev, ktime_t expires,
int force)
{
ktime_t now = ktime_get();
int i;

while (1) {
for (i = 0;;) {
int ret = clockevents_program_event(dev, expires, now);

if (!ret || !force)
return ret;

/*
* We tried 2 times to program the device with the given
* min_delta_ns. If that's not working then we double it
* and emit a warning.
*/
if (++i > 2) {
printk(KERN_WARNING "CE: __tick_program_event of %s is "
"stuck %llx %llx\n", dev->name ? dev->name : "?",
now.tv64, expires.tv64);
printk(KERN_WARNING
"CE: increasing min_delta_ns %ld to %ld nsec\n",
dev->min_delta_ns, dev->min_delta_ns << 1);
WARN_ON(1);

/* Double the min. delta and try again */
if (!dev->min_delta_ns)
dev->min_delta_ns = 5000;
else
dev->min_delta_ns <<= 1;
i = 0;
}

now = ktime_get();
expires = ktime_add(now, ktime_set(0, dev->min_delta_ns));
expires = ktime_add_ns(now, dev->min_delta_ns);
}
}

Expand All @@ -47,7 +71,7 @@ int tick_program_event(ktime_t expires, int force)
{
struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev;

return __tick_program_event(dev, expires, force);
return tick_dev_program_event(dev, expires, force);
}

/**
Expand All @@ -71,7 +95,7 @@ void tick_setup_oneshot(struct clock_event_device *newdev,
{
newdev->event_handler = handler;
clockevents_set_mode(newdev, CLOCK_EVT_MODE_ONESHOT);
__tick_program_event(newdev, next_event, 1);
tick_dev_program_event(newdev, next_event, 1);
}

/**
Expand Down

0 comments on commit 60a4ab5

Please sign in to comment.