Make the control flow more readable. No functional changes. Signed-off-by: Wolfgang Mauerer <wolfgang.maue...@siemens.com> --- kernel/ipipe/timer.c | 82 +++++++++++++++++++++++++++++++------------------ 1 files changed, 52 insertions(+), 30 deletions(-)
diff --git a/kernel/ipipe/timer.c b/kernel/ipipe/timer.c index 8b2eb6f..765340e 100644 --- a/kernel/ipipe/timer.c +++ b/kernel/ipipe/timer.c @@ -154,21 +154,55 @@ static void ipipe_timer_request_sync(void) timer->request(timer, steal); } +/* Set up a timer as per-cpu timer for ipipe */ +static int install_pcpu_timer(unsigned cpu, unsigned hrclock_freq, + struct ipipe_timer *t) { + unsigned hrtimer_freq; + unsigned long long tmp; + +#ifdef CONFIG_GENERIC_CLOCKEVENTS + struct clock_event_device *evtdev; + evtdev = t->host_timer; + + if (evtdev && evtdev->mode == CLOCK_EVT_MODE_SHUTDOWN) + return 0; +#endif /* CONFIG_GENERIC_CLOCKEVENTS */ + + if (__ipipe_hrtimer_freq == 0) + __ipipe_hrtimer_freq = t->freq; + + per_cpu(ipipe_percpu.hrtimer_irq, cpu) = t->irq; + per_cpu(percpu_timer, cpu) = t; + + hrtimer_freq = t->freq; + if (__ipipe_hrclock_freq > UINT_MAX) + hrtimer_freq /= 1000; + + t->c2t_integ = hrtimer_freq / hrclock_freq; + tmp = (((unsigned long long) + (hrtimer_freq % hrclock_freq)) << 32) + + hrclock_freq - 1; + do_div(tmp, hrclock_freq); + t->c2t_frac = tmp; + + return 1; +} + + /* - * choose per-cpu timer: we walk the list, and find the timer with the - * highest rating. + * Choose per-cpu timers with the highest rating by traversing the + * rating-sorted list for each CPU. */ int ipipe_select_timers(const struct cpumask *mask) { - struct clock_event_device *evtdev; - unsigned hrclock_freq, hrtimer_freq; + unsigned hrclock_freq; unsigned long long tmp; struct ipipe_timer *t; unsigned long flags; - unsigned cpu, khz; + unsigned cpu; + bool found; - khz = __ipipe_hrclock_freq > UINT_MAX; - if (khz) { + if (__ipipe_hrclock_freq > UINT_MAX) { tmp = __ipipe_hrclock_freq; do_div(tmp, 1000); hrclock_freq = tmp; @@ -177,34 +211,22 @@ int ipipe_select_timers(const struct cpumask *mask) spin_lock_irqsave(&lock, flags); for_each_cpu(cpu, mask) { + found = false; list_for_each_entry(t, &timers, link) { if (!cpumask_test_cpu(cpu, t->cpumask)) continue; - evtdev = t->host_timer; -#ifdef CONFIG_GENERIC_CLOCKEVENTS - if (!evtdev - || evtdev->mode != CLOCK_EVT_MODE_SHUTDOWN) -#endif /* CONFIG_GENERIC_CLOCKEVENTS */ - goto found; + if (install_pcpu_timer(cpu, hrclock_freq, t)) { + found = true; + break; + } + } + + if (!found) { + printk("I-pipe: could not find timer for cpu #%d\n", + cpu); + goto err_remove_all; } - printk("I-pipe: could not find timer for cpu #%d\n", cpu); - goto err_remove_all; - - found: - if (__ipipe_hrtimer_freq == 0) - __ipipe_hrtimer_freq = t->freq; - per_cpu(ipipe_percpu.hrtimer_irq, cpu) = t->irq; - per_cpu(percpu_timer, cpu) = t; - hrtimer_freq = t->freq; - if (khz) - hrtimer_freq /= 1000; - t->c2t_integ = hrtimer_freq / hrclock_freq; - tmp = (((unsigned long long) - (hrtimer_freq % hrclock_freq)) << 32) - + hrclock_freq - 1; - do_div(tmp, hrclock_freq); - t->c2t_frac = tmp; } spin_unlock_irqrestore(&lock, flags); -- 1.7.1 _______________________________________________ Xenomai mailing list Xenomai@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai