diff options
Diffstat (limited to 'include/linux/sched.h')
| -rw-r--r-- | include/linux/sched.h | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 02e16d207304..8981e52c714f 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -453,23 +453,33 @@ struct task_cputime { | |||
| 453 | cputime_t utime; | 453 | cputime_t utime; |
| 454 | cputime_t stime; | 454 | cputime_t stime; |
| 455 | unsigned long long sum_exec_runtime; | 455 | unsigned long long sum_exec_runtime; |
| 456 | spinlock_t lock; | ||
| 457 | }; | 456 | }; |
| 458 | /* Alternate field names when used to cache expirations. */ | 457 | /* Alternate field names when used to cache expirations. */ |
| 459 | #define prof_exp stime | 458 | #define prof_exp stime |
| 460 | #define virt_exp utime | 459 | #define virt_exp utime |
| 461 | #define sched_exp sum_exec_runtime | 460 | #define sched_exp sum_exec_runtime |
| 462 | 461 | ||
| 462 | #define INIT_CPUTIME \ | ||
| 463 | (struct task_cputime) { \ | ||
| 464 | .utime = cputime_zero, \ | ||
| 465 | .stime = cputime_zero, \ | ||
| 466 | .sum_exec_runtime = 0, \ | ||
| 467 | } | ||
| 468 | |||
| 463 | /** | 469 | /** |
| 464 | * struct thread_group_cputime - thread group interval timer counts | 470 | * struct thread_group_cputimer - thread group interval timer counts |
| 465 | * @totals: thread group interval timers; substructure for | 471 | * @cputime: thread group interval timers. |
| 466 | * uniprocessor kernel, per-cpu for SMP kernel. | 472 | * @running: non-zero when there are timers running and |
| 473 | * @cputime receives updates. | ||
| 474 | * @lock: lock for fields in this struct. | ||
| 467 | * | 475 | * |
| 468 | * This structure contains the version of task_cputime, above, that is | 476 | * This structure contains the version of task_cputime, above, that is |
| 469 | * used for thread group CPU clock calculations. | 477 | * used for thread group CPU timer calculations. |
| 470 | */ | 478 | */ |
| 471 | struct thread_group_cputime { | 479 | struct thread_group_cputimer { |
| 472 | struct task_cputime totals; | 480 | struct task_cputime cputime; |
| 481 | int running; | ||
| 482 | spinlock_t lock; | ||
| 473 | }; | 483 | }; |
| 474 | 484 | ||
| 475 | /* | 485 | /* |
| @@ -518,10 +528,10 @@ struct signal_struct { | |||
| 518 | cputime_t it_prof_incr, it_virt_incr; | 528 | cputime_t it_prof_incr, it_virt_incr; |
| 519 | 529 | ||
| 520 | /* | 530 | /* |
| 521 | * Thread group totals for process CPU clocks. | 531 | * Thread group totals for process CPU timers. |
| 522 | * See thread_group_cputime(), et al, for details. | 532 | * See thread_group_cputimer(), et al, for details. |
| 523 | */ | 533 | */ |
| 524 | struct thread_group_cputime cputime; | 534 | struct thread_group_cputimer cputimer; |
| 525 | 535 | ||
| 526 | /* Earliest-expiration cache. */ | 536 | /* Earliest-expiration cache. */ |
| 527 | struct task_cputime cputime_expires; | 537 | struct task_cputime cputime_expires; |
| @@ -558,7 +568,7 @@ struct signal_struct { | |||
| 558 | * Live threads maintain their own counters and add to these | 568 | * Live threads maintain their own counters and add to these |
| 559 | * in __exit_signal, except for the group leader. | 569 | * in __exit_signal, except for the group leader. |
| 560 | */ | 570 | */ |
| 561 | cputime_t cutime, cstime; | 571 | cputime_t utime, stime, cutime, cstime; |
| 562 | cputime_t gtime; | 572 | cputime_t gtime; |
| 563 | cputime_t cgtime; | 573 | cputime_t cgtime; |
| 564 | unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; | 574 | unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; |
| @@ -567,6 +577,14 @@ struct signal_struct { | |||
| 567 | struct task_io_accounting ioac; | 577 | struct task_io_accounting ioac; |
| 568 | 578 | ||
| 569 | /* | 579 | /* |
| 580 | * Cumulative ns of schedule CPU time fo dead threads in the | ||
| 581 | * group, not including a zombie group leader, (This only differs | ||
| 582 | * from jiffies_to_ns(utime + stime) if sched_clock uses something | ||
| 583 | * other than jiffies.) | ||
| 584 | */ | ||
| 585 | unsigned long long sum_sched_runtime; | ||
| 586 | |||
| 587 | /* | ||
| 570 | * We don't bother to synchronize most readers of this at all, | 588 | * We don't bother to synchronize most readers of this at all, |
| 571 | * because there is no reader checking a limit that actually needs | 589 | * because there is no reader checking a limit that actually needs |
| 572 | * to get both rlim_cur and rlim_max atomically, and either one | 590 | * to get both rlim_cur and rlim_max atomically, and either one |
| @@ -630,7 +648,6 @@ struct user_struct { | |||
| 630 | atomic_t inotify_devs; /* How many inotify devs does this user have opened? */ | 648 | atomic_t inotify_devs; /* How many inotify devs does this user have opened? */ |
| 631 | #endif | 649 | #endif |
| 632 | #ifdef CONFIG_EPOLL | 650 | #ifdef CONFIG_EPOLL |
| 633 | atomic_t epoll_devs; /* The number of epoll descriptors currently open */ | ||
| 634 | atomic_t epoll_watches; /* The number of file descriptors currently watched */ | 651 | atomic_t epoll_watches; /* The number of file descriptors currently watched */ |
| 635 | #endif | 652 | #endif |
| 636 | #ifdef CONFIG_POSIX_MQUEUE | 653 | #ifdef CONFIG_POSIX_MQUEUE |
| @@ -2183,27 +2200,14 @@ static inline int spin_needbreak(spinlock_t *lock) | |||
| 2183 | /* | 2200 | /* |
| 2184 | * Thread group CPU time accounting. | 2201 | * Thread group CPU time accounting. |
| 2185 | */ | 2202 | */ |
| 2186 | 2203 | void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times); | |
| 2187 | static inline | 2204 | void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times); |
| 2188 | void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times) | ||
| 2189 | { | ||
| 2190 | struct task_cputime *totals = &tsk->signal->cputime.totals; | ||
| 2191 | unsigned long flags; | ||
| 2192 | |||
| 2193 | spin_lock_irqsave(&totals->lock, flags); | ||
| 2194 | *times = *totals; | ||
| 2195 | spin_unlock_irqrestore(&totals->lock, flags); | ||
| 2196 | } | ||
| 2197 | 2205 | ||
| 2198 | static inline void thread_group_cputime_init(struct signal_struct *sig) | 2206 | static inline void thread_group_cputime_init(struct signal_struct *sig) |
| 2199 | { | 2207 | { |
| 2200 | sig->cputime.totals = (struct task_cputime){ | 2208 | sig->cputimer.cputime = INIT_CPUTIME; |
| 2201 | .utime = cputime_zero, | 2209 | spin_lock_init(&sig->cputimer.lock); |
| 2202 | .stime = cputime_zero, | 2210 | sig->cputimer.running = 0; |
| 2203 | .sum_exec_runtime = 0, | ||
| 2204 | }; | ||
| 2205 | |||
| 2206 | spin_lock_init(&sig->cputime.totals.lock); | ||
| 2207 | } | 2211 | } |
| 2208 | 2212 | ||
| 2209 | static inline void thread_group_cputime_free(struct signal_struct *sig) | 2213 | static inline void thread_group_cputime_free(struct signal_struct *sig) |
