Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 15c6f176 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ARM: arch_timer: force re-selection of the best clocksource"

parents b1f7061c 880276e9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -714,6 +714,7 @@ static void __init arch_timer_common_init(void)
	arch_timer_banner(arch_timers_present);
	arch_counter_register(arch_timers_present);
	arch_timer_arch_init();
	clocksource_select_force();
}

static void __init arch_timer_init(struct device_node *np)
+1 −0
Original line number Diff line number Diff line
@@ -289,6 +289,7 @@ extern void clocksource_suspend(void);
extern void clocksource_resume(void);
extern struct clocksource * __init clocksource_default_clock(void);
extern void clocksource_mark_unstable(struct clocksource *cs);
extern void clocksource_select_force(void);

extern u64
clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask);
+33 −15
Original line number Diff line number Diff line
@@ -182,7 +182,7 @@ static int finished_booting;

#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
static void clocksource_watchdog_work(struct work_struct *work);
static void clocksource_select(void);
static void clocksource_select(bool force);

static LIST_HEAD(watchdog_list);
static struct clocksource *watchdog;
@@ -459,7 +459,7 @@ static int clocksource_watchdog_kthread(void *data)
{
	mutex_lock(&clocksource_mutex);
	if (__clocksource_watchdog_kthread())
		clocksource_select();
		clocksource_select(false);
	mutex_unlock(&clocksource_mutex);
	return 0;
}
@@ -600,11 +600,12 @@ static u64 clocksource_max_deferment(struct clocksource *cs)

#ifndef CONFIG_ARCH_USES_GETTIMEOFFSET

static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur)
static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur,
						bool force)
{
	struct clocksource *cs;

	if (!finished_booting || list_empty(&clocksource_list))
	if ((!finished_booting && !force) || list_empty(&clocksource_list))
		return NULL;

	/*
@@ -622,13 +623,13 @@ static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur)
	return NULL;
}

static void __clocksource_select(bool skipcur)
static void __clocksource_select(bool skipcur, bool force)
{
	bool oneshot = tick_oneshot_mode_active();
	struct clocksource *best, *cs;

	/* Find the best suitable clocksource */
	best = clocksource_find_best(oneshot, skipcur);
	best = clocksource_find_best(oneshot, skipcur, force);
	if (!best)
		return;

@@ -669,23 +670,40 @@ static void __clocksource_select(bool skipcur)
 * Select the clocksource with the best rating, or the clocksource,
 * which is selected by userspace override.
 */
static void clocksource_select(void)
static void clocksource_select(bool force)
{
	return __clocksource_select(false);
	return __clocksource_select(false, force);
}

static void clocksource_select_fallback(void)
{
	return __clocksource_select(true);
	return __clocksource_select(true, false);
}

#else /* !CONFIG_ARCH_USES_GETTIMEOFFSET */

static inline void clocksource_select(void) { }
static inline void clocksource_select(bool force) { }
static inline void clocksource_select_fallback(void) { }

#endif

/**
 * clocksource_select_force - Force re-selection of the best clocksource
 *				among registered clocksources
 *
 * clocksource_select() can't select the best clocksource before
 * calling clocksource_done_booting() and since clocksource_select()
 * should be called with clocksource_mutex held, provide a new API
 * can be called from other files to select best clockrouce irrespective
 * of finished_booting flag.
 */
void clocksource_select_force(void)
{
	mutex_lock(&clocksource_mutex);
	clocksource_select(true);
	mutex_unlock(&clocksource_mutex);
}

/*
 * clocksource_done_booting - Called near the end of core bootup
 *
@@ -702,7 +720,7 @@ static int __init clocksource_done_booting(void)
	 * Run the watchdog first to eliminate unstable clock sources
	 */
	__clocksource_watchdog_kthread();
	clocksource_select();
	clocksource_select(false);
	mutex_unlock(&clocksource_mutex);
	return 0;
}
@@ -796,7 +814,7 @@ int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq)
	mutex_lock(&clocksource_mutex);
	clocksource_enqueue(cs);
	clocksource_enqueue_watchdog(cs);
	clocksource_select();
	clocksource_select(false);
	mutex_unlock(&clocksource_mutex);
	return 0;
}
@@ -823,7 +841,7 @@ int clocksource_register(struct clocksource *cs)
	mutex_lock(&clocksource_mutex);
	clocksource_enqueue(cs);
	clocksource_enqueue_watchdog(cs);
	clocksource_select();
	clocksource_select(false);
	mutex_unlock(&clocksource_mutex);
	return 0;
}
@@ -845,7 +863,7 @@ void clocksource_change_rating(struct clocksource *cs, int rating)
{
	mutex_lock(&clocksource_mutex);
	__clocksource_change_rating(cs, rating);
	clocksource_select();
	clocksource_select(false);
	mutex_unlock(&clocksource_mutex);
}
EXPORT_SYMBOL(clocksource_change_rating);
@@ -948,7 +966,7 @@ static ssize_t sysfs_override_clocksource(struct device *dev,

	ret = sysfs_get_uname(buf, override_name, count);
	if (ret >= 0)
		clocksource_select();
		clocksource_select(false);

	mutex_unlock(&clocksource_mutex);