@@ -234,7 +234,8 @@ static int bL_switch_to(unsigned int new_cluster_id)
tdev = NULL;
if (tdev) {
tdev_mode = tdev->evtdev->mode;
- clockevents_set_mode(tdev->evtdev, CLOCK_EVT_MODE_SHUTDOWN);
+ WARN_ON(clockevents_set_mode(tdev->evtdev,
+ CLOCK_EVT_MODE_SHUTDOWN));
}
ret = cpu_pm_enter();
@@ -262,7 +263,7 @@ static int bL_switch_to(unsigned int new_cluster_id)
ret = cpu_pm_exit();
if (tdev) {
- clockevents_set_mode(tdev->evtdev, tdev_mode);
+ WARN_ON(clockevents_set_mode(tdev->evtdev, tdev_mode));
clockevents_program_event(tdev->evtdev,
tdev->evtdev->next_event, 1);
}
@@ -160,7 +160,7 @@ extern int clockevents_update_freq(struct clock_event_device *ce, u32 freq);
extern void clockevents_exchange_device(struct clock_event_device *old,
struct clock_event_device *new);
-extern void clockevents_set_mode(struct clock_event_device *dev,
+extern int clockevents_set_mode(struct clock_event_device *dev,
enum clock_event_mode mode);
extern int clockevents_program_event(struct clock_event_device *dev,
ktime_t expires, bool force);
@@ -101,7 +101,7 @@ EXPORT_SYMBOL_GPL(clockevent_delta2ns);
*
* Must be called with interrupts disabled !
*/
-void clockevents_set_mode(struct clock_event_device *dev,
+int clockevents_set_mode(struct clock_event_device *dev,
enum clock_event_mode mode)
{
if (dev->mode != mode) {
@@ -119,6 +119,8 @@ void clockevents_set_mode(struct clock_event_device *dev,
}
}
}
+
+ return 0;
}
/**
@@ -127,7 +129,7 @@ void clockevents_set_mode(struct clock_event_device *dev,
*/
void clockevents_shutdown(struct clock_event_device *dev)
{
- clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN);
+ WARN_ON(clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN));
dev->next_event.tv64 = KTIME_MAX;
}
@@ -503,7 +505,7 @@ void clockevents_exchange_device(struct clock_event_device *old,
*/
if (old) {
module_put(old->owner);
- clockevents_set_mode(old, CLOCK_EVT_MODE_UNUSED);
+ WARN_ON(clockevents_set_mode(old, CLOCK_EVT_MODE_UNUSED));
list_del(&old->list);
list_add(&old->list, &clockevents_released);
}
@@ -464,7 +464,8 @@ int tick_resume_broadcast(void)
bc = tick_broadcast_device.evtdev;
if (bc) {
- clockevents_set_mode(bc, CLOCK_EVT_MODE_RESUME);
+ if (clockevents_set_mode(bc, CLOCK_EVT_MODE_RESUME))
+ goto unlock;
switch (tick_broadcast_device.mode) {
case TICKDEV_MODE_PERIODIC:
@@ -479,6 +480,7 @@ int tick_resume_broadcast(void)
break;
}
}
+unlock:
raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
return broadcast;
@@ -532,8 +534,11 @@ static int tick_broadcast_set_event(struct clock_event_device *bc, int cpu,
{
int ret;
- if (bc->mode != CLOCK_EVT_MODE_ONESHOT)
- clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
+ if (bc->mode != CLOCK_EVT_MODE_ONESHOT) {
+ ret = clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
+ if (ret)
+ return ret;
+ }
ret = clockevents_program_event(bc, expires, force);
if (!ret)
@@ -543,8 +548,7 @@ static int tick_broadcast_set_event(struct clock_event_device *bc, int cpu,
int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
{
- clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
- return 0;
+ return clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
}
/*
@@ -562,8 +566,8 @@ void tick_check_oneshot_broadcast_this_cpu(void)
* switched over, leave the device alone.
*/
if (td->mode == TICKDEV_MODE_ONESHOT) {
- clockevents_set_mode(td->evtdev,
- CLOCK_EVT_MODE_ONESHOT);
+ WARN_ON(clockevents_set_mode(td->evtdev,
+ CLOCK_EVT_MODE_ONESHOT));
}
}
}
@@ -741,7 +745,9 @@ int tick_broadcast_oneshot_control(unsigned long reason)
cpumask_clear_cpu(cpu, tick_broadcast_oneshot_mask);
} else {
if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) {
- clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
+ ret = clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
+ if (ret)
+ goto out;
/*
* The cpu which was handling the broadcast
* timer marked this cpu in the broadcast
@@ -858,7 +864,8 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
tick_broadcast_oneshot_mask, tmpmask);
if (was_periodic && !cpumask_empty(tmpmask)) {
- clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
+ WARN_ON(clockevents_set_mode(bc,
+ CLOCK_EVT_MODE_ONESHOT));
tick_broadcast_init_next_event(tmpmask,
tick_next_period);
tick_broadcast_set_event(bc, cpu, tick_next_period, 1);
@@ -140,7 +140,7 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast)
if ((dev->features & CLOCK_EVT_FEAT_PERIODIC) &&
!tick_broadcast_oneshot_active()) {
- clockevents_set_mode(dev, CLOCK_EVT_MODE_PERIODIC);
+ WARN_ON(clockevents_set_mode(dev, CLOCK_EVT_MODE_PERIODIC));
} else {
unsigned long seq;
ktime_t next;
@@ -150,7 +150,7 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast)
next = tick_next_period;
} while (read_seqretry(&jiffies_lock, seq));
- clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
+ WARN_ON(clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT));
for (;;) {
if (!clockevents_program_event(dev, next, false))
@@ -384,7 +384,7 @@ void tick_resume(void)
struct tick_device *td = &__get_cpu_var(tick_cpu_device);
int broadcast = tick_resume_broadcast();
- clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_RESUME);
+ WARN_ON(clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_RESUME));
if (!broadcast) {
if (td->mode == TICKDEV_MODE_PERIODIC)
@@ -38,7 +38,7 @@ void tick_resume_oneshot(void)
{
struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev);
- clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
+ WARN_ON(clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT));
clockevents_program_event(dev, ktime_get(), true);
}
@@ -50,7 +50,7 @@ void tick_setup_oneshot(struct clock_event_device *newdev,
ktime_t next_event)
{
newdev->event_handler = handler;
- clockevents_set_mode(newdev, CLOCK_EVT_MODE_ONESHOT);
+ WARN_ON(clockevents_set_mode(newdev, CLOCK_EVT_MODE_ONESHOT));
clockevents_program_event(newdev, next_event, true);
}
@@ -81,7 +81,7 @@ int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *))
td->mode = TICKDEV_MODE_ONESHOT;
dev->event_handler = handler;
- clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
+ WARN_ON(clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT));
tick_broadcast_switch_to_oneshot();
return 0;
}
clockevents_set_mode() calls dev->set_mode() which has return type of 'void' currently. Later patches would add another interface dev->set_dev_mode(), which will return int and clockevents_set_mode() must propagate failures returned from it. This patch changes prototype of clockevents_set_mode() to return 'int' and fix caller sites as well. As most of the call sites maynot work if clockevents_set_mode() fails, do issue a WARN() on failures. All other are updated to return error codes. Cc: Nicolas Pitre <nicolas.pitre@linaro.org> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- arch/arm/common/bL_switcher.c | 5 +++-- include/linux/clockchips.h | 2 +- kernel/time/clockevents.c | 8 +++++--- kernel/time/tick-broadcast.c | 25 ++++++++++++++++--------- kernel/time/tick-common.c | 6 +++--- kernel/time/tick-oneshot.c | 6 +++--- 6 files changed, 31 insertions(+), 21 deletions(-)