voidregister_time_interpolator(struct time_interpolator *ti){ unsigned long flags; /* Sanity check */ BUG_ON(ti->frequency == 0 || ti->mask == 0); ti->nsec_per_cyc = ((u64)NSEC_PER_SEC << ti->shift) / ti->frequency; spin_lock(&time_interpolator_lock); write_seqlock_irqsave(&xtime_lock, flags); if (is_better_time_interpolator(ti)) { time_interpolator = ti; time_interpolator_reset(); } write_sequnlock_irqrestore(&xtime_lock, flags); ti->next = time_interpolator_list; time_interpolator_list = ti; spin_unlock(&time_interpolator_lock);} voidunregister_time_interpolator(struct time_interpolator *ti){ struct time_interpolator *curr, **prev; unsigned long flags; spin_lock(&time_interpolator_lock); prev = &time_interpolator_list; for (curr = *prev; curr; curr = curr->next) { if (curr == ti) { *prev = curr->next; break; } prev = &curr->next; } write_seqlock_irqsave(&xtime_lock, flags); if (ti == time_interpolator) { /* we lost the best time-interpolator: */ time_interpolator = NULL; /* find the next-best interpolator */ for (curr = time_interpolator_list; curr; curr = curr->next) if (is_better_time_interpolator(curr)) time_interpolator = curr; time_interpolator_reset(); } write_sequnlock_irqrestore(&xtime_lock, flags); spin_unlock(&time_interpolator_lock);}#endif /* CONFIG_TIME_INTERPOLATION */ /** * msleep - sleep safely even with waitqueue interruptions * @msecs: Time in milliseconds to sleep for */void msleep(unsigned int msecs){ unsigned long timeout = msecs_to_jiffies(msecs) + 1; while (timeout) timeout = schedule_timeout_uninterruptible(timeout);} EXPORT_SYMBOL(msleep); /** * msleep_interruptible - sleep waiting for signals * @msecs: Time in milliseconds to sleep for */unsigned long msleep_interruptible(unsigned int msecs){ unsigned long timeout = msecs_to_jiffies(msecs) + 1; while (timeout && !signal_pending(current)) timeout = schedule_timeout_interruptible(timeout); return jiffies_to_msecs(timeout);} EXPORT_SYMBOL(msleep_interruptible);Lines 1501–1581 of 1581. Previous lines
void register_time_interpolator(struct time_interpolator *ti) { unsigned long flags; /* Sanity check */ BUG_ON(ti->frequency == 0 || ti->mask == 0); ti->nsec_per_cyc = ((u64)NSEC_PER_SEC << ti->shift) / ti->frequency; spin_lock(&time_interpolator_lock); write_seqlock_irqsave(&xtime_lock, flags); if (is_better_time_interpolator(ti)) { time_interpolator = ti; time_interpolator_reset(); } write_sequnlock_irqrestore(&xtime_lock, flags); ti->next = time_interpolator_list; time_interpolator_list = ti; spin_unlock(&time_interpolator_lock); } void unregister_time_interpolator(struct time_interpolator *ti) { struct time_interpolator *curr, **prev; unsigned long flags; spin_lock(&time_interpolator_lock); prev = &time_interpolator_list; for (curr = *prev; curr; curr = curr->next) { if (curr == ti) { *prev = curr->next; break; } prev = &curr->next; } write_seqlock_irqsave(&xtime_lock, flags); if (ti == time_interpolator) { /* we lost the best time-interpolator: */ time_interpolator = NULL; /* find the next-best interpolator */ for (curr = time_interpolator_list; curr; curr = curr->next) if (is_better_time_interpolator(curr)) time_interpolator = curr; time_interpolator_reset(); } write_sequnlock_irqrestore(&xtime_lock, flags); spin_unlock(&time_interpolator_lock); } #endif /* CONFIG_TIME_INTERPOLATION */ /** * msleep - sleep safely even with waitqueue interruptions * @msecs: Time in milliseconds to sleep for */ void msleep(unsigned int msecs) { unsigned long timeout = msecs_to_jiffies(msecs) + 1; while (timeout) timeout = schedule_timeout_uninterruptible(timeout); } EXPORT_SYMBOL(msleep); /** * msleep_interruptible - sleep waiting for signals * @msecs: Time in milliseconds to sleep for */ unsigned long msleep_interruptible(unsigned int msecs) { unsigned long timeout = msecs_to_jiffies(msecs) + 1; while (timeout && !signal_pending(current)) timeout = schedule_timeout_interruptible(timeout); return jiffies_to_msecs(timeout); } EXPORT_SYMBOL(msleep_interruptible);