参照元

説明

引数

返り値

参考

実装

/**
 * hrtimer_start_range_ns - (re)start an hrtimer on the current CPU
 * @timer:      the timer to be added
 * @tim:        expiry time
 * @delta_ns:   "slack" range for the timer
 * @mode:       expiry mode: absolute (HRTIMER_MODE_ABS) or
 *              relative (HRTIMER_MODE_REL)
 */
void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
                            unsigned long delta_ns, const enum hrtimer_mode mode)
{
        struct hrtimer_clock_base *base, *new_base;
        unsigned long flags;
        int leftmost;
        base = lock_hrtimer_base(timer, &flags);
        /* Remove an active timer from the queue: */
        remove_hrtimer(timer, base, true);
        if (mode & HRTIMER_MODE_REL) {
                tim = ktime_add_safe(tim, base->get_time());
                /*
                 * CONFIG_TIME_LOW_RES is a temporary way for architectures
                 * to signal that they simply return xtime in
                 * do_gettimeoffset(). In this case we want to round up by
                 * resolution when starting a relative timer, to avoid short
                 * timeouts. This will go away with the GTOD framework.
                 */
#ifdef CONFIG_TIME_LOW_RES
                tim = ktime_add_safe(tim, ktime_set(0, hrtimer_resolution));
#endif
        }

        hrtimer_set_expires_range_ns(timer, tim, delta_ns);
        /* Switch the timer base, if necessary: */
        new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED);
        timer_stats_hrtimer_set_start_info(timer);
        leftmost = enqueue_hrtimer(timer, new_base);
        if (!leftmost)
                goto unlock;
        if (!hrtimer_is_hres_active(timer)) {
                /*
                 * Kick to reschedule the next tick to handle the new timer
                 * on dynticks target.
                 */
                if (new_base->cpu_base->nohz_active)
                        wake_up_nohz_cpu(new_base->cpu_base->cpu);
        } else {
                hrtimer_reprogram(timer, new_base);
        }
unlock:
        unlock_hrtimer_base(timer, &flags);
}
EXPORT_SYMBOL_GPL(hrtimer_start_range_ns);

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-06-14 (火) 11:05:16