clocksource: Allow clocksource select to skip current clocksource
Preparatory patch for clocksource unbind support. Split out code from clocksource_select and modify it, so it skips the current clocksource on request and tries to find a fallback clocksource. Convert all existing users. No functional change. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: John Stultz <john.stultz@linaro.org> Cc: Magnus Damm <magnus.damm@gmail.com> Link: http://lkml.kernel.org/r/20130425143435.834965397@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
							parent
							
								
									09ac369c82
								
							
						
					
					
						commit
						f5a2e34375
					
				| @ -553,7 +553,7 @@ static u64 clocksource_max_deferment(struct clocksource *cs) | ||||
| 
 | ||||
| #ifndef CONFIG_ARCH_USES_GETTIMEOFFSET | ||||
| 
 | ||||
| static struct clocksource *clocksource_find_best(bool oneshot) | ||||
| static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur) | ||||
| { | ||||
| 	struct clocksource *cs; | ||||
| 
 | ||||
| @ -566,6 +566,8 @@ static struct clocksource *clocksource_find_best(bool oneshot) | ||||
| 	 * the best rating. | ||||
| 	 */ | ||||
| 	list_for_each_entry(cs, &clocksource_list, list) { | ||||
| 		if (skipcur && cs == curr_clocksource) | ||||
| 			continue; | ||||
| 		if (oneshot && !(cs->flags & CLOCK_SOURCE_VALID_FOR_HRES)) | ||||
| 			continue; | ||||
| 		return cs; | ||||
| @ -573,26 +575,20 @@ static struct clocksource *clocksource_find_best(bool oneshot) | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * clocksource_select - Select the best clocksource available | ||||
|  * | ||||
|  * Private function. Must hold clocksource_mutex when called. | ||||
|  * | ||||
|  * 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 skipcur) | ||||
| { | ||||
| 	bool oneshot = tick_oneshot_mode_active(); | ||||
| 	struct clocksource *best, *cs; | ||||
| 
 | ||||
| 	/* Find the best suitable clocksource */ | ||||
| 	best = clocksource_find_best(oneshot); | ||||
| 	best = clocksource_find_best(oneshot, skipcur); | ||||
| 	if (!best) | ||||
| 		return; | ||||
| 
 | ||||
| 	/* Check for the override clocksource. */ | ||||
| 	list_for_each_entry(cs, &clocksource_list, list) { | ||||
| 		if (skipcur && cs == curr_clocksource) | ||||
| 			continue; | ||||
| 		if (strcmp(cs->name, override_name) != 0) | ||||
| 			continue; | ||||
| 		/*
 | ||||
| @ -618,6 +614,19 @@ static void clocksource_select(void) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * clocksource_select - Select the best clocksource available | ||||
|  * | ||||
|  * Private function. Must hold clocksource_mutex when called. | ||||
|  * | ||||
|  * Select the clocksource with the best rating, or the clocksource, | ||||
|  * which is selected by userspace override. | ||||
|  */ | ||||
| static void clocksource_select(void) | ||||
| { | ||||
| 	return __clocksource_select(false); | ||||
| } | ||||
| 
 | ||||
| #else /* !CONFIG_ARCH_USES_GETTIMEOFFSET */ | ||||
| 
 | ||||
| static inline void clocksource_select(void) { } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user