linux/kernel/posix-cpu-timers.c
<<
>>
Prefs
/*
 * Implement CPU time clocks for the POSIX clock interface.
 */
   5#include <linux/sched.h>
linux/posix-timers.h>
linux/errno.h>
linux/math64.h>
asm/uaccess.h>
linux/kernel_stat.h>
trace/events/timer.h>
linux/random.h>
  14/*
 * Called after updating RLIMIT_CPU to run cpu timer and update
 * tsk->signal->cputime_expires expiration cache if necessary. Needs
 * siglock protection since other code may update expiration cache as
 * well.
 */
update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new)
  22        cputime_t cputime = secs_to_cputime(rlim_new);
  24        spin_lock_irq(&task->sighand->siglock);
set_process_cpu_timer(task, CPUCLOCK_PROF, &cputime, NULL);
spin_unlock_irq(&task->sighand->siglock);
  28
check_clock(const clockid_t which_clock)
  31        int error = 0;
task_struct *p;
pid_t pid = CPUCLOCK_PID(which_clock);
  35        if (CPUCLOCK_WHICH(which_clock) >= CPUCLOCK_MAX)
EINVAL;
  38        if (pid == 0)
  40
rcu_read_lock();
p = find_task_by_vpid(pid);
p || !(CPUCLOCK_PERTHREAD(which_clock) ?
same_thread_group(p, current) : has_group_leader_pid(p))) {
error = -EINVAL;
  47        rcu_read_unlock();
  49        return error;
  51
inline union cpu_time_count
timespec_to_sample(const clockid_t which_clock, const struct timespec *tp)
  55        union cpu_time_count ret;
ret.sched = 0;          /* high half always zero when .cpu used */
CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
ret.sched = (unsigned long long)tp->tv_sec * NSEC_PER_SEC + tp->tv_nsec;
  60                ret.cpu = timespec_to_cputime(tp);
  62        return ret;
  64
sample_to_timespec(const clockid_t which_clock,
cpu_time_count cpu,
timespec *tp)
  69        if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED)
tp = ns_to_timespec(cpu.sched);
  72                cputime_to_timespec(cpu.cpu, tp);
  74
inline int cpu_time_before(const clockid_t which_clock,
cpu_time_count now,
cpu_time_count then)
  79        if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
now.sched < then.sched;
  82                return now.cpu < then.cpu;
  84}
inline void cpu_time_add(const clockid_t which_clock,
cpu_time_count *acc,
cpu_time_count val)
  89        if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
acc->sched += val.sched;
  92                acc->cpu += val.cpu;
  94}
inline union cpu_time_count cpu_time_sub(const clockid_t which_clock,
cpu_time_count a,
cpu_time_count b)
  99        if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
a.sched -= b.sched;
 102                a.cpu -= b.cpu;
 104        return a;
 106
/*
 * Update expiry time from increment, and increase overrun count,
 * given the current clock sample.
 */
bump_cpu_timer(struct k_itimer *timer,
cpu_time_count now)
 114        int i;
 116        if (timer->it.cpu.incr.sched == 0)
 118
CPUCLOCK_WHICH(timer->it_clock) == CPUCLOCK_SCHED) {
delta, incr;
 122                if (now.sched < timer->it.cpu.expires.sched)
 124                incr = timer->it.cpu.incr.sched;
delta = now.sched + incr - timer->it.cpu.expires.sched;
/* Don't use (incr*2 < delta), incr*2 might overflow. */
i = 0; incr < delta - incr; i++)
incr = incr << 1;
i >= 0; incr >>= 1, i--) {
delta < incr)
 132                        timer->it.cpu.expires.sched += incr;
timer->it_overrun += 1 << i;
delta -= incr;
 136        } else {
cputime_t delta, incr;
 139                if (now.cpu < timer->it.cpu.expires.cpu)
 141                incr = timer->it.cpu.incr.cpu;
delta = now.cpu + incr - timer->it.cpu.expires.cpu;
/* Don't use (incr*2 < delta), incr*2 might overflow. */
i = 0; incr < delta - incr; i++)
incr += incr;
i >= 0; incr = incr >> 1, i--) {
delta < incr)
 149                        timer->it.cpu.expires.cpu += incr;
timer->it_overrun += 1 << i;
delta -= incr;
 153        }
 155
inline cputime_t prof_ticks(struct task_struct *p)
 158        cputime_t utime, stime;
 160        task_cputime(p, &utime, &stime);
 162        return utime + stime;
 164static inline cputime_t virt_ticks(struct task_struct *p)
 166        cputime_t utime;
 168        task_cputime(p, &utime, NULL);
 170        return utime;
 172
 174posix_cpu_clock_getres(const clockid_t which_clock, struct timespec *tp)
 176        int error = check_clock(which_clock);
error) {
tp->tv_sec = 0;
tp->tv_nsec = ((NSEC_PER_SEC + HZ - 1) / HZ);
CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
/*
                         * If sched_clock is using a cycle counter, we
                         * don't have anya hea of its true resolution
                         * exported, but it is much more than 1s/HZ.
                         */
tp->tv_nsec = 1;
 188        }
error;
 191
 193posix_cpu_clock_set(const clockid_t which_clock, const struct timespec *tp)
 195        /*
         * You can never reset a CPU clock, but we check for other errors
         * in the call before failing with EPERM.
         */
error = check_clock(which_clock);
error == 0) {
error = -EPERM;
 203        return error;
 205
 207/*
 * Sample a per-thread clock for the given task.
 */
cpu_clock_sample(const clockid_t which_clock, struct task_struct *p,
cpu_time_count *cpu)
 213        switch (CPUCLOCK_WHICH(which_clock)) {
 215                return -EINVAL;
CPUCLOCK_PROF:
cpu->cpu = prof_ticks(p);
 219        case CPUCLOCK_VIRT:
cpu->cpu = virt_ticks(p);
 222        case CPUCLOCK_SCHED:
cpu->sched = task_sched_runtime(p);
 225        }
 227}
 229static void update_gt_cputime(struct task_cputime *a, struct task_cputime *b)
 231        if (b->utime > a->utime)
a->utime = b->utime;
 234        if (b->stime > a->stime)
a->stime = b->stime;
 237        if (b->sum_exec_runtime > a->sum_exec_runtime)
a->sum_exec_runtime = b->sum_exec_runtime;
 240
thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)
 243        struct thread_group_cputimer *cputimer = &tsk->signal->cputimer;
task_cputime sum;
flags;
 247        if (!cputimer->running) {
/*
                 * The POSIX timer interface allows for absolute time expiry
                 * values through the TIMER_ABSTIME flag, therefore we have
                 * to synchronize the timer to the clock every time we start
                 * it.
                 */
thread_group_cputime(tsk, &sum);
raw_spin_lock_irqsave(&cputimer->lock, flags);
cputimer->running = 1;
update_gt_cputime(&cputimer->cputime, &sum);
 259                raw_spin_lock_irqsave(&cputimer->lock, flags);
times = cputimer->cputime;
raw_spin_unlock_irqrestore(&cputimer->lock, flags);
 263
/*
 * Sample a process (thread group) clock for the given group_leader task.
 * Must be called with tasklist_lock held for reading.
 */
cpu_clock_sample_group(const clockid_t which_clock,
task_struct *p,
cpu_time_count *cpu)
 272        struct task_cputime cputime;
 274        switch (CPUCLOCK_WHICH(which_clock)) {
 276                return -EINVAL;
CPUCLOCK_PROF:
thread_group_cputime(p, &cputime);
cpu->cpu = cputime.utime + cputime.stime;
 281        case CPUCLOCK_VIRT:
thread_group_cputime(p, &cputime);
cpu->cpu = cputime.utime;
 285        case CPUCLOCK_SCHED:
thread_group_cputime(p, &cputime);
cpu->sched = cputime.sum_exec_runtime;
 289        }
 291}
 293
posix_cpu_clock_get(const clockid_t which_clock, struct timespec *tp)
 296        const pid_t pid = CPUCLOCK_PID(which_clock);
error = -EINVAL;
cpu_time_count rtn;
 300        if (pid == 0) {
/*
                 * Special case constant value for our own clocks.
                 * We don't have to do anyalookup to find ourselves.
                 */
CPUCLOCK_PERTHREAD(which_clock)) {
/*
                         * Sampling just ourselves we can do with no locking.
                         */
error = cpu_clock_sample(which_clock,
current, &rtn);
 312                        read_lock(&tasklist_lock);
error = cpu_clock_sample_group(which_clock,
current, &rtn);
read_unlock(&tasklist_lock);
 317        } else {
/*
                 * Find the given PID, and validate that the caller
                 * should be able to see it.
                 */
task_struct *p;
rcu_read_lock();
p = find_task_by_vpid(pid);
p) {
CPUCLOCK_PERTHREAD(which_clock)) {
same_thread_group(p, current)) {
error = cpu_clock_sample(which_clock,
p, &rtn);
 331                        } else {
read_lock(&tasklist_lock);
thread_group_leader(p) && p->sighand) {
error =
cpu_clock_sample_group(which_clock,
p, &rtn);
 338                                read_unlock(&tasklist_lock);
 340                }
rcu_read_unlock();
 343
error)
error;
sample_to_timespec(which_clock, rtn, tp);
 348}
 350
/*
 * Validate the clockid_t for a new CPU-clock timer, and initialize the timer.
 * This is called from sys_timer_create() and do_cpu_nanosleep() with the
 * new timer already all-zeros initialized.
 */
posix_cpu_timer_create(struct k_itimer *new_timer)
 358        int ret = 0;
pid_t pid = CPUCLOCK_PID(new_timer->it_clock);
task_struct *p;
 362        if (CPUCLOCK_WHICH(new_timer->it_clock) >= CPUCLOCK_MAX)
EINVAL;
 365        INIT_LIST_HEAD(&new_timer->it.cpu.entry);
 367        rcu_read_lock();
CPUCLOCK_PERTHREAD(new_timer->it_clock)) {
pid == 0) {
p = current;
 372                        p = find_task_by_vpid(pid);
p && !same_thread_group(p, current))
p = NULL;
 376        } else {
pid == 0) {
p = current->group_leader;
 380                        p = find_task_by_vpid(pid);
p && !has_group_leader_pid(p))
p = NULL;
 384        }
new_timer->it.cpu.task = p;
p) {
get_task_struct(p);
 389                ret = -EINVAL;
 391        rcu_read_unlock();
 393        return ret;
 395
/*
 * Clean up a CPU-clock timer that is about to be destroyed.
 * This is called from timer deletion with the timer already locked.
 * If we return TIMER_RETRY, it's necessary to release the timer's lock
 * and try again.  (This happens when the timer is in the middle of firing.)
 */
posix_cpu_timer_del(struct k_itimer *timer)
 404        struct task_struct *p = timer->it.cpu.task;
ret = 0;
 407        if (likely(p != NULL)) {
read_lock(&tasklist_lock);
unlikely(p->sighand == NULL)) {
/*
                         * We raced with the reaping of the task.
                         * The deletion should have cleared us off the list.
                         */
BUG_ON(!list_empty(&timer->it.cpu.entry));
 416                        spin_lock(&p->sighand->siglock);
timer->it.cpu.firing)
ret = TIMER_RETRY;
 420                                list_del(&timer->it.cpu.entry);
spin_unlock(&p->sighand->siglock);
 423                read_unlock(&tasklist_lock);
 425                if (!ret)
put_task_struct(p);
 428
ret;
 431
/*
 * Clean out CPU timers still ticking when a thread exited.  The task
 * pointer is cleared, and the expiry time is replaced with the residual
 * time for later timer_gettime calls to return.
 * This must be called with the siglock held.
 */
cleanup_timers(struct list_head *head,
cputime_t utime, cputime_t stime,
sum_exec_runtime)
 442        struct cpu_timer_list *timer, *next;
cputime_t ptime = utime + stime;
 445        list_for_each_entry_safe(timer, next, head, entry) {
list_del_init(&timer->entry);
timer->expires.cpu < ptime) {
timer->expires.cpu = 0;
 450                        timer->expires.cpu -= ptime;
 452        }
 454        ++head;
list_for_each_entry_safe(timer, next, head, entry) {
list_del_init(&timer->entry);
timer->expires.cpu < utime) {
timer->expires.cpu = 0;
 460                        timer->expires.cpu -= utime;
 462        }
 464        ++head;
list_for_each_entry_safe(timer, next, head, entry) {
list_del_init(&timer->entry);
timer->expires.sched < sum_exec_runtime) {
timer->expires.sched = 0;
 470                        timer->expires.sched -= sum_exec_runtime;
 472        }
 474
/*
 * These are both called with the siglock held, when the current thread
 * is being reaped.  When the final (leader) thread in the group is reaped,
 * posix_cpu_timers_exit_group will be called after posix_cpu_timers_exit.
 */
posix_cpu_timers_exit(struct task_struct *tsk)
 482        cputime_t utime, stime;
 484        add_device_randomness((const void*) &tsk->se.sum_exec_runtime,
 486        task_cputime(tsk, &utime, &stime);
cleanup_timers(tsk->cpu_timers,
utime, stime, tsk->se.sum_exec_runtime);
 490}
posix_cpu_timers_exit_group(struct task_struct *tsk)
 493        struct signal_struct *const sig = tsk->signal;
cputime_t utime, stime;
 496        task_cputime(tsk, &utime, &stime);
cleanup_timers(tsk->signal->cpu_timers,
utime + sig->utime, stime + sig->stime,
tsk->se.sum_exec_runtime + sig->sum_sched_runtime);
 501
clear_dead_task(struct k_itimer *timer, union cpu_time_count now)
 504        /*
         * That's all for this thread or process.
         * We leave our residual in expires to be reported.
         */
put_task_struct(timer->it.cpu.task);
timer->it.cpu.task = NULL;
timer->it.cpu.expires = cpu_time_sub(timer->it_clock,
timer->it.cpu.expires,
now);
 514
inline int expires_gt(cputime_t expires, cputime_t new_exp)
 517        return expires == 0 || expires > new_exp;
 519
/*
 * Insert the timer on the appropriate list before any timers that
 * expire later.  This must be called with the tasklist_lock held
 * for reading, interrupts disabled and p->sighand->siglock taken.
 */
arm_timer(struct k_itimer *timer)
 527        struct task_struct *p = timer->it.cpu.task;
list_head *head, *listpos;
task_cputime *cputime_expires;
cpu_timer_list *const nt = &timer->it.cpu;
cpu_timer_list *next;
 533        if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
head = p->cpu_timers;
cputime_expires = &p->cputime_expires;
 537                head = p->signal->cpu_timers;
cputime_expires = &p->signal->cputime_expires;
 540        head += CPUCLOCK_WHICH(timer->it_clock);
 542        listpos = head;
list_for_each_entry(next, head, entry) {
cpu_time_before(timer->it_clock, nt->expires, next->expires))
 546                listpos = &next->entry;
 548        list_add(&nt->entry, listpos);
 550        if (listpos == head) {
cpu_time_count *exp = &nt->expires;
 553                /*
                 * We are the new earliest-expiring POSIX 1.b timer, hence
                 * need to update expiration cache. Take into account that
                 * for process timers we share expiration cache with itimers
                 * and RLIMIT_CPU and for thread timers with RLIMIT_RTTIME.
                 */
 560                switch (CPUCLOCK_WHICH(timer->it_clock)) {
CPUCLOCK_PROF:
expires_gt(cputime_expires->prof_exp, exp->cpu))
cputime_expires->prof_exp = exp->cpu;
 565                case CPUCLOCK_VIRT:
expires_gt(cputime_expires->virt_exp, exp->cpu))
cputime_expires->virt_exp = exp->cpu;
 569                case CPUCLOCK_SCHED:
cputime_expires->sched_exp == 0 ||
cputime_expires->sched_exp > exp->sched)
cputime_expires->sched_exp = exp->sched;
 574                }
 576}
 578/*
 * The timer is locked, fire it and arrange for its reload.
 */
cpu_timer_fire(struct k_itimer *timer)
 583        if ((timer->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE) {
/*
                 * User don't want any signal.
                 */
timer->it.cpu.expires.sched = 0;
unlikely(timer->sigq == NULL)) {
/*
                 * This a special case for clock_nanosleep,
                 * not a normal timer from sys_timer_create.
                 */
wake_up_process(timer->it_process);
timer->it.cpu.expires.sched = 0;
timer->it.cpu.incr.sched == 0) {
/*
                 * One-shot timer.  Clear it as soon as it's fired.
                 */
posix_timer_event(timer, 0);
timer->it.cpu.expires.sched = 0;
posix_timer_event(timer, ++timer->it_requeue_pending)) {
/*
                 * The signal did not get queued because the signal
                 * was ignored, so we won't get any callback to
                 * reload the timer.  But we need to keep it
                 * ticking in case the signal is deliverable next time.
                 */
posix_cpu_timer_schedule(timer);
 610}
 612/*
 * Sample a process (thread group) timer for the given group_leader task.
 * Must be called with tasklist_lock held for reading.
 */
cpu_timer_sample_group(const clockid_t which_clock,
task_struct *p,
cpu_time_count *cpu)
 620        struct task_cputime cputime;
 622        thread_group_cputimer(p, &cputime);
CPUCLOCK_WHICH(which_clock)) {
 625                return -EINVAL;
CPUCLOCK_PROF:
cpu->cpu = cputime.utime + cputime.stime;
 629        case CPUCLOCK_VIRT:
cpu->cpu = cputime.utime;
 632        case CPUCLOCK_SCHED:
cpu->sched = cputime.sum_exec_runtime + task_delta_exec(p);
 635        }
 637}
 639/*
 * Guts of sys_timer_settime for CPU timers.
 * This is called with the timer locked and interrupts disabled.
 * If we return TIMER_RETRY, it's necessary to release the timer's lock
 * and try again.  (This happens when the timer is in the middle of firing.)
 */
posix_cpu_timer_set(struct k_itimer *timer, int flags,
itimerspec *new, struct itimerspec *old)
 648        struct task_struct *p = timer->it.cpu.task;
cpu_time_count old_expires, new_expires, old_incr, val;
ret;
 652        if (unlikely(p == NULL)) {
/*
                 * Timer refers to a dead task's clock.
                 */
ESRCH;
 658
new_expires = timespec_to_sample(timer->it_clock, &new->it_value);
 661        read_lock(&tasklist_lock);
/*
         * We need the tasklist_lock to protect against reaping that
         * clears p->sighand.  If p has just been reaped, we can no
         * longer get any information about it at all.
         */
unlikely(p->sighand == NULL)) {
read_unlock(&tasklist_lock);
put_task_struct(p);
timer->it.cpu.task = NULL;
ESRCH;
 673
/*
         * Disarm any old timer after extracting its expiry time.
         */
BUG_ON(!irqs_disabled());
 679        ret = 0;
old_incr = timer->it.cpu.incr;
spin_lock(&p->sighand->siglock);
old_expires = timer->it.cpu.expires;
unlikely(timer->it.cpu.firing)) {
timer->it.cpu.firing = -1;
ret = TIMER_RETRY;
 687                list_del_init(&timer->it.cpu.entry);
 689        /*
         * We need to sample the current value to convert the new
         * value from to relative and absolute, and to convert the
         * old value from absolute to relative.  To set a process
         * timer, we need a sample to balance the thread expiry
         * times (in arm_timer).  With an absolute time, we must
         * check if it's already passed.  In short, we need a sample.
         */
CPUCLOCK_PERTHREAD(timer->it_clock)) {
cpu_clock_sample(timer->it_clock, p, &val);
 700                cpu_timer_sample_group(timer->it_clock, p, &val);
 702
old) {
old_expires.sched == 0) {
old->it_value.tv_sec = 0;
old->it_value.tv_nsec = 0;
 708                        /*
                         * Update the timer in case it has
                         * overrun already.  If it has,
                         * we'll report it as having overrun
                         * and with the next reloaded timer
                         * already ticking, though we are
                         * swallowing that pending
                         * notification here to install the
                         * new setting.
                         */
bump_cpu_timer(timer, val);
cpu_time_before(timer->it_clock, val,
timer->it.cpu.expires)) {
old_expires = cpu_time_sub(
timer->it_clock,
timer->it.cpu.expires, val);
sample_to_timespec(timer->it_clock,
old_expires,
old->it_value);
 728                                old->it_value.tv_nsec = 1;
old->it_value.tv_sec = 0;
 731                }
 733
unlikely(ret)) {
/*
                 * We are colliding with the timer actually firing.
                 * Punt after filling in the timer's old value, and
                 * disable this firing since we are already reporting
                 * it as an overrun (thanks to bump_cpu_timer above).
                 */
spin_unlock(&p->sighand->siglock);
read_unlock(&tasklist_lock);
out;
 745
new_expires.sched != 0 && !(flags & TIMER_ABSTIME)) {
cpu_time_add(timer->it_clock, &new_expires, val);
 749
/*
         * Install the new expiry time (or zero).
         * For a timer with no notification action, we don't actually
         * arm the timer (we'll just fake it for timer_gettime).
         */
timer->it.cpu.expires = new_expires;
new_expires.sched != 0 &&
cpu_time_before(timer->it_clock, val, new_expires)) {
arm_timer(timer);
 760
spin_unlock(&p->sighand->siglock);
read_unlock(&tasklist_lock);
 764        /*
         * Install the new reload setting, and
         * set up the signal and overrun bookkeeping.
         */
timer->it.cpu.incr = timespec_to_sample(timer->it_clock,
new->it_interval);
 771        /*
         * This acts as a modification timestamp for the timer,
         * so any automatic reload attempt will punt on seeing
         * that we have reset the timer manually.
         */
timer->it_requeue_pending = (timer->it_requeue_pending + 2) &
REQUEUE_PENDING;
timer->it_overrun_last = 0;
timer->it_overrun = -1;
 781        if (new_expires.sched != 0 &&
cpu_time_before(timer->it_clock, val, new_expires)) {
/*
                 * The designated time already passed, so we notify
                 * immediately, even if the thread never runs to
                 * accumulate more time on this clock.
                 */
cpu_timer_fire(timer);
 790
ret = 0;
out:
old) {
sample_to_timespec(timer->it_clock,
old_incr, &old->it_interval);
 797        return ret;
 799
posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)
 802        union cpu_time_count now;
task_struct *p = timer->it.cpu.task;
clear_dead;
 806        /*
         * Easy part: convert the reload time.
         */
sample_to_timespec(timer->it_clock,
timer->it.cpu.incr, &itp->it_interval);
 812        if (timer->it.cpu.expires.sched == 0) { /* Timer not armed at all.  */
itp->it_value.tv_sec = itp->it_value.tv_nsec = 0;
 815        }
 817        if (unlikely(p == NULL)) {
/*
                 * This task already died and the timer will never fire.
                 * In this case, expires is actually the dead value.
                 */
dead:
sample_to_timespec(timer->it_clock, timer->it.cpu.expires,
itp->it_value);
 826        }
 828        /*
         * Sample the clock to take the difference with the expiry time.
         */
CPUCLOCK_PERTHREAD(timer->it_clock)) {
cpu_clock_sample(timer->it_clock, p, &now);
clear_dead = p->exit_state;
 835                read_lock(&tasklist_lock);
unlikely(p->sighand == NULL)) {
/*
                         * The process has been reaped.
                         * We can't even collect a sample any more.
                         * Call the timer disarmed, nothing else to do.
                         */
put_task_struct(p);
timer->it.cpu.task = NULL;
timer->it.cpu.expires.sched = 0;
read_unlock(&tasklist_lock);
dead;
 848                        cpu_timer_sample_group(timer->it_clock, p, &now);
clear_dead = (unlikely(p->exit_state) &&
thread_group_empty(p));
 852                read_unlock(&tasklist_lock);
 854
unlikely(clear_dead)) {
/*
                 * We've noticed that the thread is dead, but
                 * not yet reaped.  Take this opportunity to
                 * drop our task ref.
                 */
clear_dead_task(timer, now);
dead;
 864
cpu_time_before(timer->it_clock, now, timer->it.cpu.expires)) {
sample_to_timespec(timer->it_clock,
cpu_time_sub(timer->it_clock,
timer->it.cpu.expires, now),
itp->it_value);
 871                /*
                 * The timer should have expired already, but the firing
                 * hasn't taken place yet.  Say it's just about to expire.
                 */
itp->it_value.tv_nsec = 1;
itp->it_value.tv_sec = 0;
 878}
 880/*
 * Check for any per-thread CPU timers that have fired and move them off
 * the tsk->cpu_timers[N] list onto the firing list.  Here we update the
 * tsk->it_*_expires values to reflect the remaining thread CPU timers.
 */
check_thread_timers(struct task_struct *tsk,
list_head *firing)
 888        int maxfire;
list_head *timers = tsk->cpu_timers;
signal_struct *const sig = tsk->signal;
soft;
 893        maxfire = 20;
tsk->cputime_expires.prof_exp = 0;
list_empty(timers)) {
cpu_timer_list *t = list_first_entry(timers,
cpu_timer_list,
entry);
maxfire || prof_ticks(tsk) < t->expires.cpu) {
tsk->cputime_expires.prof_exp = t->expires.cpu;
 902                }
t->firing = 1;
list_move_tail(&t->entry, firing);
 906
timers;
maxfire = 20;
tsk->cputime_expires.virt_exp = 0;
list_empty(timers)) {
cpu_timer_list *t = list_first_entry(timers,
cpu_timer_list,
entry);
maxfire || virt_ticks(tsk) < t->expires.cpu) {
tsk->cputime_expires.virt_exp = t->expires.cpu;
 917                }
t->firing = 1;
list_move_tail(&t->entry, firing);
 921
timers;
maxfire = 20;
tsk->cputime_expires.sched_exp = 0;
list_empty(timers)) {
cpu_timer_list *t = list_first_entry(timers,
cpu_timer_list,
entry);
maxfire || tsk->se.sum_exec_runtime < t->expires.sched) {
tsk->cputime_expires.sched_exp = t->expires.sched;
 932                }
t->firing = 1;
list_move_tail(&t->entry, firing);
 936
/*
         * Check for the special case thread timers.
         */
soft = ACCESS_ONCE(sig->rlim;expires.sig]"kernel/posix-cpires_cu"sref">it. 935        ass="comm9nt">                    9    *94ss="sref">CPUCLOCK_PERTHREADE" class="sref">ACCESS_ONCE(sig 930                 9      pu>;
timer->sig->rlim;expires.sig]"kernel/posix-cpires_-&gsref">it. 935        a        865       9         9      read_uCLOCK_PERTHREADharmers.c#L931(sig 850       9         9      goto dead;
cputime_expires. mers.c#L793 mer30 926                }9else {


 874;
t-> 850       9        <9 href="+code=read_unlock9 clas9="sref">read_unlock 826       9}
timer-&gass="line 936
maxfire || code=cputime_expirescputime_expires. mers.c#L793 mer30ACCESS_ONCEref="kernel/posixUSEC_SECers.c#L931_SECONCE/f="kernel/posixHZers.c#L931 926        if (tsk->/*
9a hrefocess has been reaped.
                 * W9'9e noticed that the thread is dead, butkernel/po940 940                 9nt">                 * n9t yet95    E" class="sref">ACCESS_ONCE<+code=expires 926        i        9nt">                 * d9op ou95code=itp" class="sref">itp->E" class="sref">ACCESS_ONCE<+/a>(                 */<9span>96de=thread_group_empty" class="sref">tcode=rlim" class="sref">rlim;expires.sig]"kernel/posix-cpires_cu"sref">it.(clear_deadddddddddass="line 936
dead;
tcode=rlim" clasprintresitp->cputime_expires.,
it.,
t-> 850       9if (tsk->t-> 850       9        <9 href="+code=sample_to_t9mespe9" class="sref">sample_ass="line 936
 878}
 879
 880check_thread_timers *const sig = rlim; 887{
/*
9a hrefass="line 926        ass="comm9nt">                 * T9e tim97ref">deadruct *sch"sref">it.));
sch"sch"sref">it.sch"rlim;sch"sref">it.sch" 850       9ass="comm9nt">                 * h9snƍ     850       9a"kernel/9nt">                 */<9span>97 865       9        <9 href="+code=itp" class=9sref"9itp->sch"sref">it.sch" 850       9        <9 href="+code=itp" class=9sref"9itp->sch"sref">it.sch"ta_irqrestoss="sref">tskiaw_spinref">ta_irqrestossref="+code=entry" class="ef">sch"sref">it.sch" 850       9         9posix-cpu-timers.c#L879<9 hreL979 879
/*
ce=timer" class=usu-timers.c#L868su- 850       9ass="comm9nt"> * Check for any per9threa98 922        ass="comm9nt"> * the tsk->cpu_t9mers[9] listsref">check_thread_timers(strL928i>sch"sref">it.(strL928i>sch"ef="+l_struct *const tsk,
sch"sref">it.sch"ef="rnel/posix-cpu-ti">cpu. * tsk->it_*_expi9es va98    sch_ix-cpu-timers.c#L92>sch_ief="rnel/posix-cpu-ticlass="sref">now),
sch_ix-cpu-timers.c#L92>sch_ief="rnel/posix-cpu-teur_code=t" class="srefeur_codef="kera href="kernel/posi
 887{
 */
cpu_time_b(cpu.sched;
 887{
 826       9f="kernel9posix-cpu-timers.c#L888<9 hreL98 828       9int ;
((cpu.sched;
 926        struct maxfire || >(cpu.it. 926        struct tsk->cpu.sched;
(cpu.it. 826       9unsigned 9ong ;
cpu.it.(cpu.it. 826       9uss="comm9osix-cpu-timers.c#L893dead;
t || >(cpu.it.(su-timers.c#L868su- 926        sss="comm9code=maxfire" class="sre9">max99    cpu.sched;
(firingsch_one_jiff=ref=ass="line 826       9uss="comm9code=tsk" class="sref">t9k99code=itp" class="sref">itp->cpu.it.(su-timers.c#L868su- 850       9while (!<9 href="+code=list_empty"9class99"sref">tsk->cpu_871 871       9         9                        9     9     struct cpu.sched;
 925                 9                        9     9      880sch"ed_expsch"ed_exp(s="line 88010 .c#L852;
 928       10 2       10 six-cpu-timers.c#L89310     struct cputime_expires.timereadh"epilf="kernel/posix-cpu-teur_code=t" class="srefeur_codef="k=ass="line 850       10 3       10 ode=maxfire" class="sre10 od>10 a>->t-> 850       10 4       10 ode=tsk" class="sref">t10 od>10 code=itp" claass="line 879
10 5aclass="line 880cpu.sched;
now),
sched;
now),
now),
cpu.sched;
 850       10 8       10                        10   >10 8ode=itp" claass="line 879
10 haclass="line 880,
sch_timer_lthem ll zero fieldL939 93910 es to reflect the remaining t39 93910 5s to reflect the remaining t39 939schlioiseer || ll fieldL aeL zero.  R6 93910 9#L87sref">ce=timer" class=ine=listef">it.tsk,
sch_zeroef="+f="+col_struct *const schss="sref">tsk,
schsch"sref">firingschref=ass="line 887{
10"ksix-ass="line 926       10"1       10osix-cpu-timers.c#L92210"ss="sref">CPUCLOC(sch"sref">firingschref=a href="+code=sched"">sch"sref">firingschsch"sref">firingschref=a href="+code=sched"s>sch"sref">firingschsch"sref">firingschref=a href="+code=sched"s t-> 887{
10"    struct -> 925       10"4       10code=tsk" class="sref">t10cod>10"4 879
10"5aclass="line 880 93810" noticed that the thread is *  move them off
10"he process has been reaped.
 93910 1listsref">check_thread_timers(strpu-timeosix-cpu-timers.c#L890a>(strpu-timeosix-cpef="+l_struct *const tsk,
10     struct firing)
10 code=itp" claa href="kernel/posix-cpu-timers.c#L889 889       10 5       10"kernel/posix-cpu-timers10"ke>10 "sref">tsk *const sig = tsk->signal;
sch_ix-cpu-timers.c#L92>sch_ief="rnel/posix-cpu-t">sch"sref">firingschfiring

sch
schedsched 891 10 7 10s="comment">/*
10 struct ; ttsched 891 10 8 10nt"> * Check for10nt">10 8sref">tsk *const timers = tsk->rlim; 890 10 9 10nt"> */
<10nt">10 ef">list_head *tsk, schsch"sref">firingschref=ass="line 890 104 10code=soft" class="sref">10cod>10co struct ; 10nt">10c 922 10c2 10 10ces to reflect the remaining href="+n Colernel/poscurrini pu-time totalL939 939 940 1045 10 sch"sref">it.)); sch"t->sch"sref">firingschref=aass="line 892 sch"sref">firingsch(firingschref="kernel/posix-cp">sch"sref">firingsch 892 firing

sch
(sch"sref">firingsch(firingschref="kernel/posix-cps>sch"sref">firingsch 892 ttsch"sref">firingschref="kernel/posix-cps t-> 892 924 105 10 10 hreL878sched 925 10 1 10CPUpty(timers)) { 10 struct t = (timers, 10 entry); , itp-> 929 10 5 10f="+code=unlikely" class10f=">10 " class="sref">read_uCLOCprof_ticks(firing

sch
cpu) { /*10 ix-cpu-timers.c#L917schedcpu) { * W10nt">10 struct * n10nt">10 * d10nt">10 ss="sref">list_move_tail(& 934 106 10nt"> */<10nt">10nts="sref">list_move_tail(&t->firing); 10nss="sref">CPUass="line 879 10n2aclass="line 922 1063 10"kernel/posix-cpu-timers10"ke>10n 923 10n4 10osix-cpu-timers.c#L86510ngt;10ntp->sched 925 1066 10 href="+code=sample_to_t10 hr>10nix-cpu-timerspty(timers)) { *t = (timers, entry); , itp-> 929 107 10a href="kernel/posix-cpu10a h>10a class="sref">read_uCLOCprof_ticks(sch"sref">firingschcpu) { /*10a.c#L852; schedcpu) { * T10nt">10a struct * h10nt">10as="sref">timer-&gass="line 936 */<10nt">10ass="sref">list_move_tail(& 934 1075 10 href="+code=itp" class=10 hr>10a" class="sref">read_uail(&t->firing); 10aix-cpu-timersass="line 936 10a 828 10a8 10posix-cpu-timers.c#L879<10pos>10a 923 1079 10osix-cpu-timers.c#L88010agt;/*
10nte = 20; sched 925 1081 10nt"> * Check for any per10nt">10nss="sref">CPUpty(timers)) { * the tsk->cpu_t10nt">10n struct t = (timers, * tsk->it_*_expi10nt">10n entry); , */
10ncode=itp" class="sref">itp-> 929 1085 10f="+code=check_thread_ti10f=">10n" class="sref">read_uCLOCprof_ticks(tcpu) { schedcpu) { 932 1088 10f="+code=maxfire" class=10f=">10n 10nss="sref">list_move_tail(& 934 109 10href="+code=signal_struc10hre>10hr class="sref">read_uail(&t->firing); 10hss="sref">CPUass="line 879 10h2aclass="line 922 1093 10code=maxfire" class="sre10cod>10h t10cod>10hosix-cpu-timers.c#L885 93810h5s to reflect the remaining href="+n940 940 1096 10ruct it.(strL928i>sch"ef="+=entry" class="s"sref">t->rlim;cpu.schedsch"sref">firing

sch
940 1097 10 10 >10h struct 935 1098 10 10 >10hre = 20; it.(strL928i>sch"ef="+=entry" class="s"sref">t->rlim;cpu.schedsch"sref">firingsch 935 1099 10 (!--itp>(110 = ACCESS_ONCE(sig->rlim;expires.it. 935 1101 11 ng 110ss="sref">CPUCLOCK_PERTHREADE" class="sref">ACCESS_ONCE(sig 930 1102 11 six-cpu-timers.c#L89311 struct sched(schedsch_io_sec=ef="+code=rlim" clasp>sch"sref">firing

sch
935 1103 11 ode=maxfire" class="sre11 od>11 a>-> 930 11 4 11 ode=tsk" class="sref">t11 od>110code=itp" class="sref">itp(sig->rlim;expires.it. 935 1105 11 href="+code=list_empty"11 hr>110" class="sref">read_uail(&sch_ix-cpu-timers.c#L92>sch_ief="rnel/posix-cpu-tgsref">it. 929 11 6 11 uct sched(read_uacess has been reaped.L938 938110he process has been reaped. 110e can't even collect a sample any more.
874111all the timer disarmed, nothing else to do. 940 1111 11ruct t-> 935 11 2 11 11 >111"sref">read_unlock 826 1113 11 11 >111s="sref">timer-&gass="line 936 maxfire || code=cputime_expsec="sref">sched(ACCESS_ONCEclass="line 926 11 5 11 tsk->11 hrefocess has been reaped. 839t-> 850 1119 11 href="+code=list_move_t11 hr>111code=itp" class="sref">itpE" class="sref">ACCESS_ONCE<+code=expires 926 11" 11"kernel/posix-cpu-timers11"ke>112de=thread_group_empty" class="sref">tcode=rlim" class" class="sref">ACCESS_ONCE++ass="line 850 11"1 11osix-cpu-timers.c#L922112.c#L852; rlim;expires.it.(11" struct timer-&gass="line 936 t11cod>112ss="sref">list_move_tail(&it.(firingschef="+code=rlim" class" class="sref">ACCESS_ONCEcass="line 892 112" class="sref">read_uCLOCsched(it.sched 926 11"6 11ruct schedit. 929 11"7 11 11 >112 struct 1128ode=itp" claass="line 879 113 = rlim;schhrefass="sref">schedschhrefass=f="kernel/posix-cpu-pschedsched 891 1131 11 break; rlim;schhrefass="sref">schedschhrefass=f="kernel/posix-cpu-;schedsched 891 1132 11rlim;schhrefass="sref">schedschhrefass=f="kernel/posix-cpu-t;sched 891 11 3 11 href="+code=t" class="s11 hr>113s="sref">timeCLOCK_PERTHREADe>, sch_zeross="sref">tsk, sch_zeroef="+ef="+code=it_value" s="sref">rlim;schhrefass="sref">schedschhrefass=f="k)ass="line 887{ list_move_tail(&rlim; 892 11 "srefass="line 879 11 tp 879 /* 113 noticed that the thread isL938 938 * Check for11nt">113he process has been reaped. 938 */ <11nt">113e can't even collect a s*swhenspposevet ta> 83911cod>114 e process has been reaped. 940 11c1 11nt"> 11nt">11c_L928sched_L928it.sch"ef="rnel/posix-cpu-ti>sch"sref">it.sch"ef="ass="line 887{ 114s="sref">timel_struct *const tsk, schedsch"sref">it.sch"ef="="+code=Rcode=expire">cpu.tsk, 891 1144 11 lisunionlist, 891 1145 11 114st" class="sr || >(firingsched114 struct 114he process has been reaped. 114e can't even collect a sample any more. 940 115 11 115de=thread_group_emptygoto =expires 891 11 1 11115 struct 938115es to reflect the remaining href="+n Fetchl/poscurrini sf="leers.cupdix-csre wa> 938115osix-cpu-timers.c#L885sch"sref">it.sch"ef="="+code=Rcode=expire">_clou-timers.c#L868_clou-f="k)alass="line 926 11 6 11pan class="comment">/*11 ix-cpu-timers.c#L917, sch"sref">it.sch"ef="="+code=Rcode=expire">_clou-timers.c#L868_clou-f="kref="kernel/posixp"sref">sched 892 * W11nt">11 struct sch"sref">it.sch"ef="ref="kernel/posixnowx-cpu-timers.c#now 892 * n11nt">11 firingsched_srefex-cpu-timers.c#la">_srefef="k)alass="line 926 11 9 11nt"> * d11nt">11 ss="sref">list_move_t.c#L917, ));a>, ss="sref">tsk));a>, ef="+code=rlim" clas>sch"sref">it.sch"ef="ref="kernel/posixnowx-cpu-timers.c#now 892 */<11nt">11nts="sref">list_move_tup_emptygoto =expires 891 11n1 11 href="+code=clear_dead_11 hr>116.c#L852 879 116 struct , tlou-timers.c#L868, tlou- 940 1163 11"kernel/posix-cpu-timers11"ke>116s="sref">timer-&gcode=rlim" classpin>lou-timers.c#L868lou-ef="+ef="+code=it_value" p"sref">schedrlim; 892 11ngt;116" class="sref">read_uail(&));lou-timers.c#L868));lou-ef="+ef="+code=it_value" a>, tlou-timers.c#L868, tlou- 926 1166 11 href="+code=sample_to_t11 hr>116ix-cpu-timers.c#L917unlikel="sref">firingschedrlim;read_uacess has been reaped.L938 938116he process has been reaped. 874/*11a.c#L852; tsksched 926 1172 11nt"> * T11nt">11a struct it.sch"ef="="+code=Rcode=expire">cpu.tsk, sched * h11nt">11as="sref">timer-&gcode=cpu=expiressch"sref">it.sch"ef="="+code=Rcode=expire">cpu.cpu) { */<11nt">11ass="sref">list_move_tttttttttgoto =expires 926 1175 11 href="+code=itp" class=11 hr>11a" class="sref">read_u}L841(firingsched_srefex-cpu-timers.c#la">_srefef="k)reL850ha>)); time>ha>)); sched 926 1176 11 href="+code=itp" class=11 hr>117ix-cpu-timers.c#L917 938117 noticed that the thread is ing else to do. ))#L85d>)), bui 938117he process has been reaped. /* 118all the timer disarmed, nothing else to do. 940 1181 11nt"> * Check for any per11nt">118.c#L852; ));a>, ss="sref">tsk));a>, ef="+code=rlim" clas>sch"sref">it.sch"ef="ref="kernel/posixnowx-cpu-timers.c#now 892 * the tsk->cpu_t11nt">11n struct 926 1183 11nt"> * tsk->it_*_expi11nt">11n */ 11ncode=itp" class="srefcode=rlim" classpin>lou-timers.c#L868lou-ef="+ef="+code=it_value" p"sref">schedrlim; 892 11n" class="sref">read_uist, sch"sref">it.sch"ef="="+code=Rcode=expire">_clou-timers.c#L868_clou-f="kref="kernel/posixp"sref">sched 892 11nix-cpu-timers.c#L917sch"sref">it.sch"ef="ref="kernel/posixnowx-cpu-timers.c#now 892 11n struct 1188ode=itp" claass="line 879 118 880 93811hss="s reflect the remaining href="+n Now in-arm fel/posinew refasy wa> 93811h2aclacpu-timers.c#L885t11cod>119gt;sch"sref">it.sch"ef="cass="line 892 119tp->unlou-timers.c#L868unlou-ef="+ef="+code=it_value" p"sref">schedrlim; 892 879 11hre = 20; , tlou-timers.c#L868, tlou- 926 1199 11 (!--120 = 879 1201= it.sch"ef="="+code=Rcode=expire">_overrun>lasix-cpu-timers.c#">_overrun>lasisch"sref">it.sch"ef="="+code=Rcode=expire">_overrunx-cpu-timers.c#">_overrunf="kass="line 926 1202 12 six-cpu-timers.c#L893120 struct sch"sref">it.sch"ef="="+code=Rcode=expire">_overrunx-cpu-timers.c#">_overrunf="k<=r-lass="line 934 1203 12 ode=maxfire" class="sre12 od>12 a>->it.sch"ef="="+code=Rcode=expire">_requeue_pendu-timers.c#L935_requeue_pendu-tf="kass="line 926 1204 12 ode=tsk" class="sref">t12 od>120code=ass="line 879 1205aclass="line 880120e can't even collect a s* @sf="le:a hrespana>, sch k" claurelto be e>(sted fel/ 938121all the timer disarmed, noth* @ 121ss="s reflect the remaining 938 9381212aclacpu-timers.c#L885121osix-cpu-timers.c#L885 93812 hrefsreficacode=ACCESS_ONCin; ->inuct *const sch_ , sL92>sch_ firingsch>->nel/posix-cpu-tisf="lex-cpu-timers.c#sf="leef="rss="line 935 12 7 12 *const sch"sref">firingsch>->nel/posix-cpu-tilass="sref">cpu) { 121code=itp" cla || >(cpu) { sch"sref">firingschsch"sref">firingsch(cpu) { sch"sref">firingsch 887{ 122de=thread_group_empty26 934 12"1 12osix-cpu-timers.c#L922122ss="sref">CPUCLOCK_PERTHREADlass="sref">cpu) { sch"sref">firingschsch"sref">firingschsch"sref">firingsch(cpu) { sch"sref">firingsch 887{ 12" struct timeCLOCK_PERTHREADlass="sref">cpu) { t< 934 12"4 12code=tsk" class="sref">t12cod>122ss="sref">list_mo=expirest< (cpu) { t< 887{ 122" class="sref">read_u26 934 12"6 12ruct 122 sass="line 879 1228ode=ss="line 879 123all the timer disarmed, noth* fastpath8(st - POSIX 884 938 938123osix-cpu-timers.c#L8851235s to reflect the remaining n, ers.cwha>))# 938123 hrefocess has been reaped. 938/* 123 noticed that the thread is 938 * Check for12nt">123he process has been reaped. 940 12 9 12nt"> */ <12nt">123e cansreficacode=ACCESS_ONCin; ->inuct *const (st hers.c#L935(stef="+l_struct *const tsk, t-> 940 124 12code=soft" class="sref">12cod>124 e prass="line 926 12c1 12nt"> 12nt">124ss="sref">CPUl_struct *const tsk->nel/posix-cpu-tis="sref">rlim; 925 12c2 12 sch_ix-cpu-timers.c#L92>sch_ief="rnel/posix-cpu-t">sch"sref">firingsch(&firingsch 925 12c3 12 925 12c4 12 sch"sref">firingsch>-&g+=entry" class="s"sref">t->sch"sref">firingschsch"sref">firingsch 925 12c5 12 124st" class="sr || , sch_zeross="sref">tsk, sch_zeroef="+ef="+code=it_value" s"sref">t->schhrefass="sref">schedschhrefass=f="k)aaass="line 926 12c7 12else { *const sch"sref">firingsch>->t *const 926 12c8 12 sch"sref">firingsch(sch"sref">firingsch 935 12c9 12 list_move_t.c#L917sch"sref">firingschsch"sref">firingsch 935 125 12 125de=thread_group_empty.c#L917t< "sref">t->t< 935 1251 121252aclass="line 922 12 3 12"kernel/posix-cpu-timers12"ke>125 , skf="lex-cpu-timers.c#de=tskf="lef="krtef="+code=it_value" s"sref">t->schhrefass="sref">schedschhrefass=f="k)ass="line 922 12 4 12osix-cpu-timers.c#L855125ss="sref">list_move_ttttttttt26 934 12 5 12f="+code=unlikely" class12f=">12 " class="srefass="line 879 /*125tp 879 * W12nt">12 struct rlim;"sref">t->tsk 925 12 8 12nt"> * n12nt">12 rlim;sch"sref">it.sch"="srernel/posix-cpu-="+nu-timers.c#L935 * d12nt">12 ss="sref">list_move_tl_struct *const sch"sref">firingsch>->t *const 925 126 12nt"> */<12nt">12nts="sss="line 925 1261 12 href="+code=clear_dead_12 hr>126.c#L852lou-timers.c#L868lou-ef="+ef="+code=it_value" E="sref">rlim;sch"sref">it.sch"="srernel/posix-cpu-lou-timers.c#L868 926 1262 12to 126 struct rlim;sch"sref">it.sch"="srernel/posix-cpu-c92>sch"sref">firingsch>-&gass="line 926 1263 12"kernel/posix-cpu-timers12"ke>126s="sref">timer-&gcode=rlim" clas=aw_spin>unlou-timers.c#L868unlou-ef="+ef="+code=it_value" E="sref">rlim;sch"sref">it.sch"="srernel/posix-cpu-lou-timers.c#L868 926 1264 12osix-cpu-timers.c#L86512ngt; 926 1265 12f="+code=cpu_time_before12f=">126" class="sref">read_uCLOCK_PERTHREADe>, sch_ , sL92>sch_ rlim;schhrefass="sref">schedschhrefass=f="k)ass="line 887{ lis26 925 127 12a href="kernel/posix-cpu12a h>127all tass="line 879 /*127 922 1272 12nt"> * T12nt">1272aclacpu-timers.c#L885 938 * h12nt">127es to reflect the remaining * This#L85called froml/posta> 938 */<12nt">127osix-cpu-timers.c#L8851275s to reflect the remaining n 874127 hrefocess has been reaped. 940 12a7 12"kernel/posix-cpu-timers12"ke>127 notiheck_thread_timers940<>_L928sched940<>_L928 *const tsk, t-> 940 12a8 12posix-cpu-timers.c#L879<12pos>127 926 12a9 12osix-cpu-timers.c#L880127ss="sref">lisel/posix-cpu-tiLIST_HEADx-cpu-timers.c#LIST_HEAD>-&g+=entry" class="/posix hers.c#L935 926 128 12nt">/* 128de=thread_grotimer_list, sch"sref">it.sch"ef="rnel/posix-cpu-ti>sch"sref">it.sch"ef=",rnel/posix-cpu-tinextsref">it.-&gass="line 926 1281 12nt"> * Check for any per12nt">128.c#L852 *const sched-&gass="line 926 1282 12nt"> * the tsk->cpu_t12nt">1282aclass="line 922 1283 12nt"> * tsk->it_*_expi12nt">128 */ 128gt; 926 1285 12f="+code=check_thread_ti12f=">12n" class="srefcpu-timers.c#L885 938128 hrefocess has been reaped.128he process has been reaped. 940 1289 12href="+code=list_head" c12hre>128code=itp" cla || (st hers.c#L935(stef="+el/posix-cpu-ti="sref">t-> 940 129 12href="+code=signal_struc12hre>129de=thread_group_empty26 892 129 922 1292 12osix-cpu-timers.c#L8931292ode=itp" cla || , rlim;, -&g+=entry" class="s"sref">t->sched-&g==ss="line 940 1293 12code=maxfire" class="sre12cod>129s="sref">timer-&g26 892 t12cod>129gt;1295s to reflect the remaining ing else*#Heranwana>ke off isk="+coEeL891="+coL928- 938- 938129 noticed that the thread is ing else*#putnahem onsppos/posix t 874129he process has been reaped. 940 1299 12 (!--lisel/posix-cpu-tie>(st_>ha>));sched
(st_>ha>));-&g+=entry" class="s"sref">t-> 926 13 13 - 938130ss="s reflect the remaining href="+n If i/eranaranrsy activanpu-time widosta>sch"s,38 9381302aclacpu-timers.c#L885sch" mustsbe ="+nu-t874 874 940 1304 13 ode=tsk" class="sref">t13 od>1304ode=itp" cla || =expires"sref">t->tsksch"sref">it.sch"="srernel/posix-cpu-="+nu-timers.c#L935130" class="sref">read_uist, (st_pu-timeosix-cpu-timers.c#L890f>(st_pu-timeosix-cp>-&g+=entry" class="s"sref">t-> 926 13 6 13 uct 938130he process has been reaped.< href="+n We mustsreleasanahesanlou-s beforana>ksix rsy /a> 874 874131all the timer disarmed, noth href="+n siglou-anownpu-tects ournprivix-c/posix t 938 9381312aclacpu-timers.c#L885- 938131es to reflect the remaining href="+n spin "+colnwa'vkelecaranofsi/possa>- 938 940 13 5 13 rlim;, -&g+=entry" class="s"sref">t->sched-&g=ass="line 926 1316 13 break; 1317 class="srefkcess has been reaped.L938 938 938ke38 938132all the timer disarmed, noth href="+n eachspsch"'s lou-abeforanflearsix itss/posix flag, sosno 938132ss="s reflect the remaining ing elseosia> 8741322aclacpu-timers.c#L885it.sch"ef=",rel/posix-cpu-tinextsref">it.-&g,ref="+code=it_value" fposix hers.c#L935cpu. 926 13"4 13code=tsk" class="sref">t13cod>13="+code=Rcode=expiiiii="L940<> 940 beefposix hers.c#L935-&gass="line 926 13"5 13 href="+code=list_empty"13 hr>1325aclass="line 880lou-timers.c#L868lou-ef="+ef="+code=it_value" ssch"sref">it.sch"ef="="+code=Rcode=expire">_lou-timers.c#L868_lou- 926 13"7 13 13 >132 struct del_in">cpu.del_in">ef="+ef="+code=it_value" ssch"sref">it.sch"ef="="+code=Rcode=expire">cpu. 926 13"8 13 13 >132 it.sch"ef="="+code=Rcode=expire">cpu.list_move_t=expiressch"sref">it.sch"ef="="+code=Rcode=expire">cpu.133de=thread_group_emptykcess has been reaped.L938 938 938 938133osix-cpu-timers.c#L885 940 13 5 13"kernel/posix-cpu-timers13"ke>133" class="sref">read_uCLOCK_PERTHREADlikel="sref">firing-&g 940 13 6 13osix-cpu-timers.c#L937133ix-cpu-timers.c#L917-&g+=entry" class="ssch"sref">it.sch"ef=")ass="line 926 13 7 13s="comment">/* 133 struct unlou-timers.c#L868unlou-ef="+ef="+code=it_value" ssch"sref">it.sch"ef="="+code=Rcode=expire">_lou-timers.c#L868_lou- 926 13 8 13nt"> * Check for13nt">1338ode=itp" claass="line 879 */ <13nt">133e canass="line 879 13cod>134ts="sss="line 925 13c1 13nt"> 13nt">134ss="s reflect the remainingL938 938134es to reflect the remaining * The isk="+coEeLhrs.="+coEeLlou-amustsbe held by/posicaller874 8741345aclaheck_thread_timerstsk, t->134ix-cpu-timers.c#L917 _ix-cpu-timers.c#L92>sch_ief="rnel/posix-cpu-tinewv91ss="sref">tsk _ix-cpu-timers.c#L92>sch_ief="rnel/posix-cpu-tioldv91ss="sref">tsk 940 13c7 13else { 134 926 13c9 13 940 lou-_idx hers.c#L935 926 1351 13"sref">t-> 892 135s="sref">timeCLOCK_PERTHREADoldv91ss="sref">tsk 926 13 4 13osix-cpu-timers.c#L855135ss="sref">list_move_t reflect the remainingL938 938/*135 hrefocess has been reaped. 938 * W13nt">135 noticed that the thread is ing elseeeeeeeeen itlto be absolux-874 874 * n13nt">135he process has been reaped.< href="+eeeeeeeen940 940 13 9 13nt"> * d13nt">13 ss="sref">list_move_tCLOCnel/posix-cpu-tioldv91ss="sref">tsk 926 136 13nt"> */<13nt">136de=thread_group_empty.c#L917tsk(136.c#L852list_move_t reflect the remainingL9 Justsaboutlto fir<.en940 940 1362 13to 136 struct tsk(firingsch_one_jiff= 926 1363 13"kernel/posix-cpu-timers13"ke>136s="sref">timer-&ggggggggg}L841 926 1364 13osix-cpu-timers.c#L865136ss="sref">list_move_ttttttttteeeeeeeenel/posix-cpu-tioldv91ss="sref">tsk(136" class="sref">read_ugggggggg}ss="line 926 1366 13 href="+code=sample_to_t13 hr>136ix-cpu-timers.c#L917<}ss="line 926 1367 13 13n sss="line 926 1368 13 13 >136 tsk 940 1369 13 &136ss="sref">list_move_t.c#L917<26 892 tsk(/*137.c#L852 926 1372 13nt"> * T13nt">1372aclass="line 922 1373 13nt"> * h13nt">137 */<13nt">137osix-cpu-timers.c#L885 9381375s to reflect the remaining up_emptyn RLIMIT_CPU limienis earliel/poansprofhref ef"sia> 874137 hrefocess has been reaped. 940 13a7 13"kernel/posix-cpu-timers13"ke>137 struct lou-_idx hers.c#L935 926 13a8 13posix-cpu-timers.c#L879<13pos>137 list_move_tCLOCrnel/posix-cpu-lefass=_gi hers.c#L935-&g+=entry" class="s"sref">t->tskschhrefass="sref">schedschhrefass=f="kernel/posix-cpu-profhref"sref">schedtsk 940 138 13nt">/* 138de=thread_group_empty.c#L917<=entry" class="s"sref">t->tskschhrefass="sref">schedschhrefass=f="kernel/posix-cpu-profhref"sref">schedtsk 926 1381 13nt"> * Check for any per13nt">138.c#L852 926 1382 13nt"> * the tsk->cpu_t13nt">1382 * tsk->it_*_expi13nt">138 t->tskschhrefass="sref">schedschhrefass=f="kernel/posix-cpu-virthref"sref">schedtsk 940 1384 13nt"> */ 138ss="sref">list_move_ttttttttt=entry" class="s"sref">t->tskschhrefass="sref">schedschhrefass=f="kernel/posix-cpu-virthref"sref">schedtsk 926 1385 13f="+code=check_thread_ti13f=">138" class="sref">read_ubreakass="line 926 1386 13 struct 138ix-cpu-timers}ss="line 926 13n7 13posix-cpu-timers.c#L888<13pos>138 sass="line 879 1388ode=ss="line 879 138e cansrefica="L940<> 940 dooc928nanosleef"sref">sched-&g+constUK_PERTHREAD lou-id_ix-cpu-timers.c#Llou-id_i *const sched-&g,ss="line 940 139 13href="+code=signal_struc13hre>139de=thread_group_emptyyyyyyyyyyyyyl_struct *const specsref">it.schspecef="rnel/posix-cpu-tirqtf"sref">sched *const sch"specsref">it.sch"specef="rnel/posix-cpu-ti">cpu.139 926 1392 13osix-cpu-timers.c#L8931392ode=itp" clatimer_list, sch"sref">it.sch"ef="rcode=it_value" ssch"sref">it.sch"ef="ass="line 926 1393 13code=maxfire" class="sre13cod>139s="sref">timeinuct *const it. 926 1394 13code=tsk" class="sref">t13cod>139gt; 926 1395 13 href="+code=list_empty"13 hr>139" class="srefcpu-timers.c#L885 938 *const cpu.>-&g+ef="+code=it_value" ssch"sref">it.sch"ef=", 0,rlizeofrcode=it_value" ssch"sref">it.sch"ef="cass="line 892 lisel/posix-cpu-tispin>lou-_in">cpu.lou-_in">>-&g+ef="+code=it_value" ssch"sref">it.sch"ef="ernel/posix-cpu-">_lou-timers.c#L868_lou- 926 14 14 -it.sch"ef="ernel/posix-cpu-">_clou-timers.c#L868_clou-f="k /a>(1401= it.sch"ef="ernel/posix-cpu-">_overruntimers.c#L868_overrunf="k /a-lass="line 934 1402 14 six-cpu-timers.c#L893140 struct it.(it.sch"ef="cass="line 926 14 3 14 ode=maxfire" class="sre14 od>140 it.sch"ef="ernel/posix-cpu-">_pu-timetimers.c#L868_pu-timef="k /a>(t14 od>1404ode=itp" cla || it. 926 1405 14 href="+code=list_empty"14 hr>140" class="sref">read_usrefical_struct *const sch"specsref">it.sch"specef="rt *const cpu.hrefass="line 926 14 6 14 uct cpu.>-&g+el/posix-cpu-ti">cpu.cpu. 940 ">cpu._valu< hers.c#L935_valusched 926 14 9 14 (!--141de=thread_group_emptykl/posix-cpu-tispin>lou-_irqcpu.lou-_irq>-&g+ef="+code=it_value" ssch"sref">it.sch"ef="ernel/posix-cpu-">_lou-timers.c#L868_lou- 926 1411 14ruct it.(it.sch"ef=", t *const sched-&g,n40<> 940 ">cpu.lrro"sref">it. 926 1413 14 14 >141s="sref">timer-&gggggggggkl/posix-cpu-tispin>unlou-_irqcpu.unlou-_irq>-&g+ef="+code=it_value" ssch"sref">it.sch"ef="ernel/posix-cpu-">_lou-timers.c#L868_lou- 926 1414 14 (!--list_move_ttttttttt26 *const it. 926 14 5 14 read_uass="line 879 141 struct -&g+el/posix-cpu-tiLurreni hers.c#L935 926 1418 14 href="+code=t" class="s14 hr>141 sch"sref">it.sch"ef="ernel/posix-cpu-">cpu.sched141ss="sref">list_move_t.c#L917 938142all the timer disarmed, noth href="+++++++++++++++++++++++++* Our /a> 938142ss="s reflect the remaining ing else++++++++++++++++++++++++* deletion cflenot fail874 8741422aclacpu-timers.c#L885timer-&gggggggggggggggggk(it.sch"ef="cass="line 926 14"4 14code=tsk" class="sref">t14cod>14="+code=Rcode=expiiiiiggggggggggggggggk(it.sch"ef="ernel/posix-cpu-">_lou-timers.c#L868_lou- 926 14"5 14 href="+code=list_empty"14 hr>142" class="sref">read_ugggggggggggggggg26 925 14"6 14ruct 142 sss="line 926 14"8 14 14 >142 938 940 1431 14 break; lisrnel/posix-cpu-__se>_ urreni_sref< hers.c#L935_ urreni_sref<>-&g+el/posix-cpu-tiTASK_INTERRUPTIBLE hers.c#L935 926 1432 14unlou-_irqcpu.unlou-_irq>-&g+ef="+code=it_value" ssch"sref">it.sch"ef="ernel/posix-cpu-">_lou-timers.c#L868_lou- 926 14 3 14 href="+code=t" class="s14 hr>143s="sref">timer-&gggggggggkl/posix-cpu-tisch-tulex-cpu-timers.c#sch-tule>-&g+cass="line 926 14 4 14 href="+code=list_move_t14 hr>143ss="sref">list_move_ttttttttt=entry" class="spin>lou-_irqcpu.lou-_irq>-&g+ef="+code=it_value" ssch"sref">it.sch"ef="ernel/posix-cpu-">_lou-timers.c#L868_lou- 926 14 5 14"kernel/posix-cpu-timers14"ke>143" class="sref">read_uass="line 879 143tp 879 /* 143 struct * Check for14nt">143he process has been reaped.< href="+eeeeeeeen We weraninterrupted by/a EeL891a38 938 */ <14nt">143e can't even collect a s href="+++++++++*940 940 144 14code=soft" class="sref">14cod>144de=thread_group_emptykl/posix-cpu-tisf="le;to_da> specsref">it. spec>-&g+el/posix-cpu-tiptych_clou-timers.c#L868sch"sref">it.sch"ef="ernel/posix-cpu-">cpu.schedsched 926 14c1 14nt"> 14nt">144.c#L852it.(it.sch"ef=", 0,ref="+code=it_value" zero_">cpu.href,n40<> 940 ">cpu.144 struct it. 926 14c3 14 timer-&gggggggggkpu-timers.c#L885 9381445s to reflect the remaining ing elseeeeeeeee++++++++*940 940 1446 14 goto _L928._L928-&g+ef="+code=it_value" ssch"sref">it.sch"ef="cass="line 926 14c7 14else { 879 940 spin>unlou-_irqcpu.unlou-_irq>-&g+ef="+code=it_value" ssch"sref">it.sch"ef="ernel/posix-cpu-">_lou-timers.c#L868_lou- 926 14c9 14 it.( 926 1451 14lisrpu-timers.c#L885 938 874145es to reflect the remaining ++++++++n mid.le"ofnfposix. In oi/er"casas|weta-timercfree.>- 938145osix-cpu-timers.c#L885 938/*145ix-cpu-timers.c#L917it.sch"ef="ernel/posix-cpu-">_lou-timers.c#L868_lou- 926 14 7 14nt"> * W14nt">145 struct it.(it.sch"ef="cass="line 926 14 8 14nt"> * n14nt">145 it.sch"ef="ernel/posix-cpu-">_lou-timers.c#L868_lou- 926 14 9 14nt"> * d14nt">14 ss="sref">list_move_tass="line 879 */<14nt">146ts="sss="line 925 1461 14 href="+code=clear_dead_14 hr>146.c#L852cpu._valu< hers.c#L935_valuit.v_secc#L85|n40<> 940 ">cpu._valu< hers.c#L935_valuit.v_nsecc#L8) //a0=aass="line 926 1462 14to 146 struct 938146es to reflect the remaining ++++++++n It actuall= didef hrta-timera38 938146osix-cpu-timers.c#L885 940 1465 14f="+code=cpu_time_before14f=">146" class="sref">read_ugggggggg26 925 1466 14 href="+code=sample_to_t14 hr>146ix-cpu-timers.c#L917<}ss="line 926 1467 14 14n sss="line 926 1468 14 14 >146 it.it. 926 1469 14 &146ss="sref">lis}ss="line 926 147 14a href="kernel/posix-cpu14a h>147ts="sss="line 925 1471 14pan class="comment">/*147.c#L852 *const it. 926 1472 14nt"> * T14nt">1472acla}ss="line 926 1473 14nt"> * h14nt">147 926 1474 14nt"> */<14nt">147osix-sreficalonga>(1475aclass="line 880147 hrefsrefica="L940<> 940 940<>_L928nsleefcpu._L928nsleef>-&g+constUK_PERTHREAD lou-id_ix-cpu-timers.c#Llou-id_i *const sched-&g,ss="line 940 14a7 14"kernel/posix-cpu-timers14"ke>147 struct it.schspecef="rnel/posix-cpu-tirqtf"sref">sched *const specsref">it.schspecef="rrnel/posix-cpu-__ush"sref">it.sched 940 14a8 14posix-cpu-timers.c#L879<14pos>147 926 14a9 14osix-cpu-timers.c#L880147ss="sref">lisl_struct *const _blou-timers.c#L868_blou-c#L85nel/posix-cpu-tirs=tar>_blou-timers.c#L868_blou-c#L8 =ss="line 926 148 14nt">/* 148de=thread_group_emptyef="+code=it_value" urreni_thtime_infox-cpu-timers.c#Lurreni_thtime_info>-&g+c="+code=Rcode=expirers=tar>_blou-timers.c#L868_blou-c#L8ass="line 926 1481 14nt"> * Check for any per14nt">148.c#L852 *const sch"specsref">it.sch"specef="rt *const cpu. * the tsk->cpu_t14nt">1482 it. 926 1483 14nt"> * tsk->it_*_expi14nt">148 926 1484 14nt"> */ 148ss="sref">lisrpu-timers.c#L885 9381485s to reflect the remaining up_emptyn Diagnose requ hrdcerro"ss/posa874 874148 hrefocess has been reaped. 940 14n7 14posix-cpu-timers.c#L888<14pos>148 struct -&g+el/posix-cpu-tiptych_clou-timers.c#L868 940 14n8 14f="+code=maxfire" class=14f=">148 148ss="sref">list_mov=expires-&g+el/posix-cpu-tiptych_clou-timers.c#L868149de=thread_group_empty26 926 1491 14ong 149 926 1492 14osix-cpu-timers.c#L8931492ode=itp" clak(it.(sched-&g+el/posix-cpu-tiptych_clou-timers.c#L868sched-&g,n40<> 940 rqtf"sref">schedcpu.t14cod>1494ode=itp" cla || rnel/posix-cpu-erro"sref">it.it. 926 1495 14 href="+code=list_empty"14 hr>1495aclass="line 880sched-&gref="+a>( 926 1498 14 14 >149 149e can't even collect a s href="+++++++++* Report backcwo ahe ush" posipschel_ill126mainsix.38 938 940 15 1 15 ng 150.c#L852schedit.-&g+el/posix-cpu-tirmtf"sref">schedcpu._valu< hers.c#L935_valusched 940 1502 15 six-cpu-timers.c#L893150 struct 926 15 3 15 ode=maxfire" class="sre15 od>150 926 15 4 15 ode=tsk" class="sref">t15 od>150ss="sref">list_move_tde=Rcode=expirers=tar>_blou-timers.c#L868_blou-c#L8="+code=Rcode=expirefntimers.c#L868(150" class="sref">read_ude=Rcode=expirers=tar>_blou-timers.c#L868_blou-c#L8="+code=Rcode=expirenanosleef"sref">sched-&gernel/posix-cpu-tlou-idx-cpu-timers.c#Llou-idef=" /a>(150ix-cpu-timers.c#L917_blou-timers.c#L868_blou-c#L8="+code=Rcode=expirenanosleef"sref">sched-&gernel/posix-cpu-rmtf"sref">sched(sched 926 15 7 15 15 >150 struct _blou-timers.c#L868_blou-c#L8="+code=Rcode=expirenanosleef"sref">sched-&gernel/posix-cpu-lefass="sref">sched(schedschspec;to_n=>-&g+el/posix-cpu-tirqtf"sref">sched 926 15 8 15 15 >1508ode=itp" claass="line 879 lis26 *const it. 926 151 15 href="+code=list_empty"15 hr>151de=thass="line 879 _L928nsleef_ss=tar>cpu._L928nsleef_ss=tar>>-&g+l_struct *const _blou-timers.c#L868_blou-c#L85nel/posix-cpu-tirs=tar>_blou-timers.c#L868_blou-c#L8css="line 926 1513 15 15 >151s="srass="line 926 1514 15 (!--lisK_PERTHREAD lou-id_ix-cpu-timers.c#Llou-id_i (sched-&gernel/posix-cpu-tlou-idx-cpu-timers.c#Llou-idef="ass="line 926 1515 15 it.schspecef="rrnel/posix-cpu-ass="sref">tsk 926 1516 15 break; *const sch"specsref">it.sch"specef="rt *const cpu.151 struct *const it. 926 1518 15 href="+code=t" class="s15 hr>1518ode=ss="line 879 lisel/posix-cpu-tiass="sref">tsk(it. spec>-&g+el/posix-cpu-tirs=tar>_blou-timers.c#L868_blou-c#L8="+code=Rcode=expirenanosleef"sref">sched-&gernel/posix-cpu-lefass="sref">sched 926 15" 15"kernel/posix-cpu-timers15"ke>152ts="sss="line 925 15"1 15osix-cpu-timers.c#L9221521= it.(sched-&g+el/posix-cpu-tiptych_clou-timers.c#L868tskcpu.1522aclass="line 922 15"3 15code=maxfire" class="sre15cod>152s="sref">time || rnel/posix-cpu-erro"sref">it.it. 926 15"4 15code=tsk" class="sref">t15cod>15="+code=Rcode=expiiiiil_struct *const specsref">it.schspecef="rrnel/posix-cpu-__ush"sref">it.sched(sched-&gernel/posix-cpu-rmtf"sref">sched 926 15"5 15 href="+code=list_empty"15 hr>152" class="sref">read_ukpu-timers.c#L885 938 938152 noticed that the thread is ing elseyyyyyyyy*940 940 15"8 15 15 >152 schedit.-&g+el/posix-cpu-tirmtf"sref">schedcpu._valu< hers.c#L935_valusched 940 15"9 15 (!--list_move_t.c#L917<26 926 153 15 925 1531 15 break; _blou-timers.c#L868_blou-c#L8="+code=Rcode=expirenanosleef"sref">sched-&gernel/posix-cpu-lefass="sref">sched(schedschspec;to_n=>-&g+ef="+code=it_value" ass="sref">tsk 926 1532 15time26 *const it. 926 15 4 15 href="+code=list_move_t15 hr>153gt; 926 15 5 15"kernel/posix-cpu-timers15"ke>153" claass="line 879 153tp 879 /* 153 s#def/* *const it. *const it.-&g+0,r=expires 926 15 8 15nt"> * Check for15nt">153he pr#def/* *const it.t *const it.-&g+0,r=expires 926 15 9 15nt"> */ <15nt">153 88015cod>154de=thsrefica="L940<> 940 9u-timeoc928 lou-_getss="sref">sched-&g+constUK_PERTHREAD lou-id_ix-cpu-timers.c#Llou-id_i 880 15nt">154.c#L852 *const specsref">it.schspecef="rnel/posix-cpu-titf"sref">sched 940 15c2 15 154s="sref">time26 *const _L928 lou-_getss="sref">sched_L928 lou-_getss=>-&g+el/posix-cpu-tiPROCESS_CLOCKsref">it.f"sref">sched 926 15c4 15 1545s tosrefica="L940<> 940 9u-timeoc928 lou-_get"sref">sched-&g+constUK_PERTHREAD lou-id_ix-cpu-timers.c#Llou-id_i 880it.schspecef="rnel/posix-cpu-titf"sref">sched 940 15c7 15else { 154 sched_L928 lou-_get>-&g+el/posix-cpu-tiPROCESS_CLOCKsref">it.f"sref">sched 926 15c9 15 940 9u-timeoc928-&g+l_struct *const sch"sref">it.sch"ef="rnel/posix-cpu-titsch"sref">it.sch"ef="css="line 879 1552ode=itp" clak(it.sch"ef="="+code=Rcode=expire">_clou-timers.c#L868_clou-f="k /a>(it. 926 15 3 15"kernel/posix-cpu-timers15"ke>155s="sref">time26 *const _L928_L928-&g+el/posix-cpu-titsch"sref">it.sch"ef="cass="line 926 15 4 15osix-cpu-timers.c#L855155osix-ass="line 879 940 9u-timeoc928nsleefcpu.-&g+constUK_PERTHREAD lou-id_ix-cpu-timers.c#Llou-id_i *const sched-&g,ss="line 940 15 6 15pan class="comment">/*155ix-cpu-timers.c#L917 *const specsref">it.schspecef="rnel/posix-cpu-tirqtf"sref">sched 940 15 7 15nt"> * W15nt">155 struct it.schspecef="rrnel/posix-cpu-__ush"sref">it.sched 879 * n15nt">155 926 15 9 15nt"> * d15nt">155ss="sref">lis26 *const _L928nsleefcpu._L928nsleef>-&g+el/posix-cpu-tiPROCESS_CLOCKsref">it.sched-&g,n40<> 940 rqtf"sref">schedsched 926 156 15nt"> */<15nt">156de=thass="line 879 cpu.>-&g+l_struct *const _blou-timers.c#L868_blou-c#L85nel/posix-cpu-tirs=tar>_blou-timers.c#L868_blou-c#L8css="line 926 1562 15to 156 sass="line 926 1563 15"kernel/posix-cpu-timers15"ke>156s="sref">time26 926 1564 15osix-cpu-timers.c#L865156osix-ass="line 879 1565s tosrefica="L940<> 940 thtime_L928 lou-_getss="sref">sched-&g+constUK_PERTHREAD lou-id_ix-cpu-timers.c#Llou-id_i 880it.schspecef="rnel/posix-cpu-titf"sref">sched 940 1567 15 156 sass="line 926 1568 15 15 >156 sched_L928 lou-_getss=>-&g+el/posix-cpu-tiTHREAD_CLOCKsref">it.f"sref">sched 926 1569 15 &156 879 940 thtime_L928 lou-_get"sref">sched-&g+constUK_PERTHREAD lou-id_ix-cpu-timers.c#Llou-id_i 880/*157.c#L852 *const specsref">it.schspecef="rnel/posix-cpu-titf"sref">sched 940 1572 15nt"> * T15nt">157 sass="line 926 1573 15nt"> * h15nt">157s="sref">time26 *const _L928 lou-_get"sref">sched_L928 lou-_get>-&g+el/posix-cpu-tiTHREAD_CLOCKsref">it.f"sref">sched 926 1574 15nt"> */<15nt">157osix-ass="line 879 1575s tosrefica="L940<> 940 thtime_L928-&g+l_struct *const sch"sref">it.sch"ef="rnel/posix-cpu-titsch"sref">it.sch"ef="css="line 879 157 hrefass="line 926 1577 15"kernel/posix-cpu-timers15"ke>157 struct it.sch"ef="="+code=Rcode=expire">_clou-timers.c#L868_clou-f="k /a>(it. 926 1578 15posix-cpu-timers.c#L879<15pos>157 it.sch"ef="cass="line 926 15a9 15osix-cpu-timers.c#L880157 879 /* 158ts="sss="line 925 1581 15nt"> * Check for any per15nt">158.c#L8srstruct *const lou-_940<>_L92x-cpu-timers.c#Llou-_940<>_L92f="k /aass="line 926 1582 15nt"> * the tsk->cpu_t15nt">1582 sched-&gf="/a>(sched_L928 lou-_getss=>-&g,ss="line 880 * tsk->it_*_expi15nt">1583 _L928 lou-_se>cpu._L928tlou-_se> <,ss="line 880 */ 158ss="sref">lisernel/posix-cpu-tlou-_get"sref">sched(sched_L928 lou-_get>-&g,ss="line 8801585s="sref">lisernel/posix-cpu--&gref/a>(lisernel/posix-cpu-nsleefcpu.-&glllllllll/a>(_L928nsleef_ss=tar>cpu._L928nsleef_ss=tar>>-&g,ss="line 880158 _L928cpu._L928>-&g,ss="line 880158ss="sref">lisernel/posix-cpu-.(159de=thread_groernel/posix-cpu-sched(sched_L928ta hr_get <,ss="line 880159 926 1592 15osix-cpu-timers.c#L8931592aclass="line 922 1593 15code=maxfire" class="sre15cod>159 cpu. 940 in">_940<>_L928ta hr="sref">sched_940<>_L928ta hr=>-&g+voidcss="line 879 t15cod>1594ode=ass="line 926 1595 15 href="+code=list_empty"15 hr>159" class="srefl_struct *const 9u-timecpu.159ix-cpu-timers.c#L917sched-&gf="/a>(sched-&g,ss="line 880159 struct sched(sched-&g,ss="line 880159 -&g,ss="line 880list_move_ternel/posix-cpu-nsleefcpu.-&glllllllll/a>(160de=thread_group_emptyernel/posix-cpu-nsleef_ss=tar>cpu.>-&g /a>(160.c#L852 926 1602 16 six-cpu-timers.c#L893160 struct *const thtime hers.c#L935timer-&gernel/posix-cpu-tlou-_getss="sref">sched-&gf="/a>(sched-&g,ss="line 880t16 od>160ss="sref">list_move_ternel/posix-cpu-tlou-_get"sref">sched(sched-&g,ss="line 880160" class="sref">read_uernel/posix-cpu--&gref/a>(160ix-cpu-timers}ass="line 926 1607 16 16 >160 struct *const specsref">it.schspecef="rrnel/posix-cpu-a="sref">sched 926 16 8 16 16 >1608ode=ss="line 879 lisel/posix-cpu-ti940<>_/a> _/a> -&g+el/posix-cpu-tiCLOCK_PROCESS_CPUTIME_IDx-cpu-timers.c#CLOCK_PROCESS_CPUTIME_ID="sr,ref="+code=it_value" 9u-timecpu.1610s="sref">lisel/posix-cpu-ti940<>_/a> _/a> -&g+el/posix-cpu-tiCLOCK_THREAD_CPUTIME_IDx-cpu-timers.c#CLOCK_THREAD_CPUTIME_ID="sr,ref="+code=it_value" thtime hers.c#L935161 926 1612 16 16 >1612ode=itp" clak(it. ;to_da> spec>-&g+el/posix-cpu-ti926/a> ;one_jiffysref">it. ;one_jiffy="sr,ref="+code=it_value" t="sref">sched 926 1613 16 16 >1613ode=itp" clak(schedit.v_nsecc#L8ass="line 926 1614 16 (!--lisK_PERTHREADWARN_ONsref">it.-&g+el/posix-cpu-tit="sref">schedit.v_secc#L85!/a0=ass="line 926 1615 16 1616 class="sref26 925 16 7 16callcpu.call>-&g+el/posix-cpu-tiin">_940<>_L928ta hr="sref">sched_940<>_L928ta hr=>-&g=ass="line 926 1619 16 href="+code=list_move_t16 hr>161ss="s
The original LXR software by posis="lineLXR threun">y="sr,rthis experiead al v ion by s="linelxr@e=lux.no="sre
lxr.e=lux.no kindly hosthd by s="lineRedpill L=lpro AS="sr,rprovider of L=lux consulting and operations servitim since 1995.