diff options
Diffstat (limited to 'include/linux/sched.h')
| -rw-r--r-- | include/linux/sched.h | 301 |
1 files changed, 79 insertions, 222 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index d35d2b6ddbfb..178a8d909f14 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -127,18 +127,6 @@ extern void proc_sched_show_task(struct task_struct *p, struct seq_file *m); | |||
| 127 | extern void proc_sched_set_task(struct task_struct *p); | 127 | extern void proc_sched_set_task(struct task_struct *p); |
| 128 | extern void | 128 | extern void |
| 129 | print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq); | 129 | print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq); |
| 130 | #else | ||
| 131 | static inline void | ||
| 132 | proc_sched_show_task(struct task_struct *p, struct seq_file *m) | ||
| 133 | { | ||
| 134 | } | ||
| 135 | static inline void proc_sched_set_task(struct task_struct *p) | ||
| 136 | { | ||
| 137 | } | ||
| 138 | static inline void | ||
| 139 | print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) | ||
| 140 | { | ||
| 141 | } | ||
| 142 | #endif | 130 | #endif |
| 143 | 131 | ||
| 144 | /* | 132 | /* |
| @@ -163,9 +151,10 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) | |||
| 163 | #define TASK_DEAD 64 | 151 | #define TASK_DEAD 64 |
| 164 | #define TASK_WAKEKILL 128 | 152 | #define TASK_WAKEKILL 128 |
| 165 | #define TASK_WAKING 256 | 153 | #define TASK_WAKING 256 |
| 166 | #define TASK_STATE_MAX 512 | 154 | #define TASK_PARKED 512 |
| 155 | #define TASK_STATE_MAX 1024 | ||
| 167 | 156 | ||
| 168 | #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW" | 157 | #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKWP" |
| 169 | 158 | ||
| 170 | extern char ___assert_task_state[1 - 2*!!( | 159 | extern char ___assert_task_state[1 - 2*!!( |
| 171 | sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; | 160 | sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; |
| @@ -242,7 +231,7 @@ extern void init_idle_bootup_task(struct task_struct *idle); | |||
| 242 | 231 | ||
| 243 | extern int runqueue_is_locked(int cpu); | 232 | extern int runqueue_is_locked(int cpu); |
| 244 | 233 | ||
| 245 | #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ) | 234 | #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) |
| 246 | extern void nohz_balance_enter_idle(int cpu); | 235 | extern void nohz_balance_enter_idle(int cpu); |
| 247 | extern void set_cpu_sd_state_idle(void); | 236 | extern void set_cpu_sd_state_idle(void); |
| 248 | extern int get_nohz_timer_target(void); | 237 | extern int get_nohz_timer_target(void); |
| @@ -320,13 +309,10 @@ extern signed long schedule_timeout_killable(signed long timeout); | |||
| 320 | extern signed long schedule_timeout_uninterruptible(signed long timeout); | 309 | extern signed long schedule_timeout_uninterruptible(signed long timeout); |
| 321 | asmlinkage void schedule(void); | 310 | asmlinkage void schedule(void); |
| 322 | extern void schedule_preempt_disabled(void); | 311 | extern void schedule_preempt_disabled(void); |
| 323 | extern int mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner); | ||
| 324 | 312 | ||
| 325 | struct nsproxy; | 313 | struct nsproxy; |
| 326 | struct user_namespace; | 314 | struct user_namespace; |
| 327 | 315 | ||
| 328 | #include <linux/aio.h> | ||
| 329 | |||
| 330 | #ifdef CONFIG_MMU | 316 | #ifdef CONFIG_MMU |
| 331 | extern void arch_pick_mmap_layout(struct mm_struct *mm); | 317 | extern void arch_pick_mmap_layout(struct mm_struct *mm); |
| 332 | extern unsigned long | 318 | extern unsigned long |
| @@ -526,7 +512,8 @@ struct signal_struct { | |||
| 526 | unsigned int has_child_subreaper:1; | 512 | unsigned int has_child_subreaper:1; |
| 527 | 513 | ||
| 528 | /* POSIX.1b Interval Timers */ | 514 | /* POSIX.1b Interval Timers */ |
| 529 | struct list_head posix_timers; | 515 | int posix_timer_id; |
| 516 | struct list_head posix_timers; | ||
| 530 | 517 | ||
| 531 | /* ITIMER_REAL timer for the process */ | 518 | /* ITIMER_REAL timer for the process */ |
| 532 | struct hrtimer real_timer; | 519 | struct hrtimer real_timer; |
| @@ -570,7 +557,7 @@ struct signal_struct { | |||
| 570 | cputime_t utime, stime, cutime, cstime; | 557 | cputime_t utime, stime, cutime, cstime; |
| 571 | cputime_t gtime; | 558 | cputime_t gtime; |
| 572 | cputime_t cgtime; | 559 | cputime_t cgtime; |
| 573 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING | 560 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE |
| 574 | struct cputime prev_cputime; | 561 | struct cputime prev_cputime; |
| 575 | #endif | 562 | #endif |
| 576 | unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; | 563 | unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; |
| @@ -606,6 +593,7 @@ struct signal_struct { | |||
| 606 | #endif | 593 | #endif |
| 607 | #ifdef CONFIG_AUDIT | 594 | #ifdef CONFIG_AUDIT |
| 608 | unsigned audit_tty; | 595 | unsigned audit_tty; |
| 596 | unsigned audit_tty_log_passwd; | ||
| 609 | struct tty_audit_buf *tty_audit_buf; | 597 | struct tty_audit_buf *tty_audit_buf; |
| 610 | #endif | 598 | #endif |
| 611 | #ifdef CONFIG_CGROUPS | 599 | #ifdef CONFIG_CGROUPS |
| @@ -637,6 +625,7 @@ struct signal_struct { | |||
| 637 | #define SIGNAL_STOP_STOPPED 0x00000001 /* job control stop in effect */ | 625 | #define SIGNAL_STOP_STOPPED 0x00000001 /* job control stop in effect */ |
| 638 | #define SIGNAL_STOP_CONTINUED 0x00000002 /* SIGCONT since WCONTINUED reap */ | 626 | #define SIGNAL_STOP_CONTINUED 0x00000002 /* SIGCONT since WCONTINUED reap */ |
| 639 | #define SIGNAL_GROUP_EXIT 0x00000004 /* group exit in progress */ | 627 | #define SIGNAL_GROUP_EXIT 0x00000004 /* group exit in progress */ |
| 628 | #define SIGNAL_GROUP_COREDUMP 0x00000008 /* coredump in progress */ | ||
| 640 | /* | 629 | /* |
| 641 | * Pending notifications to parent. | 630 | * Pending notifications to parent. |
| 642 | */ | 631 | */ |
| @@ -768,31 +757,6 @@ enum cpu_idle_type { | |||
| 768 | }; | 757 | }; |
| 769 | 758 | ||
| 770 | /* | 759 | /* |
| 771 | * Increase resolution of nice-level calculations for 64-bit architectures. | ||
| 772 | * The extra resolution improves shares distribution and load balancing of | ||
| 773 | * low-weight task groups (eg. nice +19 on an autogroup), deeper taskgroup | ||
| 774 | * hierarchies, especially on larger systems. This is not a user-visible change | ||
| 775 | * and does not change the user-interface for setting shares/weights. | ||
| 776 | * | ||
| 777 | * We increase resolution only if we have enough bits to allow this increased | ||
| 778 | * resolution (i.e. BITS_PER_LONG > 32). The costs for increasing resolution | ||
| 779 | * when BITS_PER_LONG <= 32 are pretty high and the returns do not justify the | ||
| 780 | * increased costs. | ||
| 781 | */ | ||
| 782 | #if 0 /* BITS_PER_LONG > 32 -- currently broken: it increases power usage under light load */ | ||
| 783 | # define SCHED_LOAD_RESOLUTION 10 | ||
| 784 | # define scale_load(w) ((w) << SCHED_LOAD_RESOLUTION) | ||
| 785 | # define scale_load_down(w) ((w) >> SCHED_LOAD_RESOLUTION) | ||
| 786 | #else | ||
| 787 | # define SCHED_LOAD_RESOLUTION 0 | ||
| 788 | # define scale_load(w) (w) | ||
| 789 | # define scale_load_down(w) (w) | ||
| 790 | #endif | ||
| 791 | |||
| 792 | #define SCHED_LOAD_SHIFT (10 + SCHED_LOAD_RESOLUTION) | ||
| 793 | #define SCHED_LOAD_SCALE (1L << SCHED_LOAD_SHIFT) | ||
| 794 | |||
| 795 | /* | ||
| 796 | * Increase resolution of cpu_power calculations | 760 | * Increase resolution of cpu_power calculations |
| 797 | */ | 761 | */ |
| 798 | #define SCHED_POWER_SHIFT 10 | 762 | #define SCHED_POWER_SHIFT 10 |
| @@ -817,62 +781,6 @@ enum cpu_idle_type { | |||
| 817 | 781 | ||
| 818 | extern int __weak arch_sd_sibiling_asym_packing(void); | 782 | extern int __weak arch_sd_sibiling_asym_packing(void); |
| 819 | 783 | ||
| 820 | struct sched_group_power { | ||
| 821 | atomic_t ref; | ||
| 822 | /* | ||
| 823 | * CPU power of this group, SCHED_LOAD_SCALE being max power for a | ||
| 824 | * single CPU. | ||
| 825 | */ | ||
| 826 | unsigned int power, power_orig; | ||
| 827 | unsigned long next_update; | ||
| 828 | /* | ||
| 829 | * Number of busy cpus in this group. | ||
| 830 | */ | ||
| 831 | atomic_t nr_busy_cpus; | ||
| 832 | |||
| 833 | unsigned long cpumask[0]; /* iteration mask */ | ||
| 834 | }; | ||
| 835 | |||
| 836 | struct sched_group { | ||
| 837 | struct sched_group *next; /* Must be a circular list */ | ||
| 838 | atomic_t ref; | ||
| 839 | |||
| 840 | unsigned int group_weight; | ||
| 841 | struct sched_group_power *sgp; | ||
| 842 | |||
| 843 | /* | ||
| 844 | * The CPUs this group covers. | ||
| 845 | * | ||
| 846 | * NOTE: this field is variable length. (Allocated dynamically | ||
| 847 | * by attaching extra space to the end of the structure, | ||
| 848 | * depending on how many CPUs the kernel has booted up with) | ||
| 849 | */ | ||
| 850 | unsigned long cpumask[0]; | ||
| 851 | }; | ||
| 852 | |||
| 853 | static inline struct cpumask *sched_group_cpus(struct sched_group *sg) | ||
| 854 | { | ||
| 855 | return to_cpumask(sg->cpumask); | ||
| 856 | } | ||
| 857 | |||
| 858 | /* | ||
| 859 | * cpumask masking which cpus in the group are allowed to iterate up the domain | ||
| 860 | * tree. | ||
| 861 | */ | ||
| 862 | static inline struct cpumask *sched_group_mask(struct sched_group *sg) | ||
| 863 | { | ||
| 864 | return to_cpumask(sg->sgp->cpumask); | ||
| 865 | } | ||
| 866 | |||
| 867 | /** | ||
| 868 | * group_first_cpu - Returns the first cpu in the cpumask of a sched_group. | ||
| 869 | * @group: The group whose first cpu is to be returned. | ||
| 870 | */ | ||
| 871 | static inline unsigned int group_first_cpu(struct sched_group *group) | ||
| 872 | { | ||
| 873 | return cpumask_first(sched_group_cpus(group)); | ||
| 874 | } | ||
| 875 | |||
| 876 | struct sched_domain_attr { | 784 | struct sched_domain_attr { |
| 877 | int relax_domain_level; | 785 | int relax_domain_level; |
| 878 | }; | 786 | }; |
| @@ -883,6 +791,8 @@ struct sched_domain_attr { | |||
| 883 | 791 | ||
| 884 | extern int sched_domain_level_max; | 792 | extern int sched_domain_level_max; |
| 885 | 793 | ||
| 794 | struct sched_group; | ||
| 795 | |||
| 886 | struct sched_domain { | 796 | struct sched_domain { |
| 887 | /* These fields must be setup */ | 797 | /* These fields must be setup */ |
| 888 | struct sched_domain *parent; /* top domain must be null terminated */ | 798 | struct sched_domain *parent; /* top domain must be null terminated */ |
| @@ -899,6 +809,8 @@ struct sched_domain { | |||
| 899 | unsigned int wake_idx; | 809 | unsigned int wake_idx; |
| 900 | unsigned int forkexec_idx; | 810 | unsigned int forkexec_idx; |
| 901 | unsigned int smt_gain; | 811 | unsigned int smt_gain; |
| 812 | |||
| 813 | int nohz_idle; /* NOHZ IDLE status */ | ||
| 902 | int flags; /* See SD_* */ | 814 | int flags; /* See SD_* */ |
| 903 | int level; | 815 | int level; |
| 904 | 816 | ||
| @@ -971,18 +883,6 @@ extern void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[], | |||
| 971 | cpumask_var_t *alloc_sched_domains(unsigned int ndoms); | 883 | cpumask_var_t *alloc_sched_domains(unsigned int ndoms); |
| 972 | void free_sched_domains(cpumask_var_t doms[], unsigned int ndoms); | 884 | void free_sched_domains(cpumask_var_t doms[], unsigned int ndoms); |
| 973 | 885 | ||
| 974 | /* Test a flag in parent sched domain */ | ||
| 975 | static inline int test_sd_parent(struct sched_domain *sd, int flag) | ||
| 976 | { | ||
| 977 | if (sd->parent && (sd->parent->flags & flag)) | ||
| 978 | return 1; | ||
| 979 | |||
| 980 | return 0; | ||
| 981 | } | ||
| 982 | |||
| 983 | unsigned long default_scale_freq_power(struct sched_domain *sd, int cpu); | ||
| 984 | unsigned long default_scale_smt_power(struct sched_domain *sd, int cpu); | ||
| 985 | |||
| 986 | bool cpus_share_cache(int this_cpu, int that_cpu); | 886 | bool cpus_share_cache(int this_cpu, int that_cpu); |
| 987 | 887 | ||
| 988 | #else /* CONFIG_SMP */ | 888 | #else /* CONFIG_SMP */ |
| @@ -1017,72 +917,6 @@ struct mempolicy; | |||
| 1017 | struct pipe_inode_info; | 917 | struct pipe_inode_info; |
| 1018 | struct uts_namespace; | 918 | struct uts_namespace; |
| 1019 | 919 | ||
| 1020 | struct rq; | ||
| 1021 | struct sched_domain; | ||
| 1022 | |||
| 1023 | /* | ||
| 1024 | * wake flags | ||
| 1025 | */ | ||
| 1026 | #define WF_SYNC 0x01 /* waker goes to sleep after wakup */ | ||
| 1027 | #define WF_FORK 0x02 /* child wakeup after fork */ | ||
| 1028 | #define WF_MIGRATED 0x04 /* internal use, task got migrated */ | ||
| 1029 | |||
| 1030 | #define ENQUEUE_WAKEUP 1 | ||
| 1031 | #define ENQUEUE_HEAD 2 | ||
| 1032 | #ifdef CONFIG_SMP | ||
| 1033 | #define ENQUEUE_WAKING 4 /* sched_class::task_waking was called */ | ||
| 1034 | #else | ||
| 1035 | #define ENQUEUE_WAKING 0 | ||
| 1036 | #endif | ||
| 1037 | |||
| 1038 | #define DEQUEUE_SLEEP 1 | ||
| 1039 | |||
| 1040 | struct sched_class { | ||
| 1041 | const struct sched_class *next; | ||
| 1042 | |||
| 1043 | void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags); | ||
| 1044 | void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags); | ||
| 1045 | void (*yield_task) (struct rq *rq); | ||
| 1046 | bool (*yield_to_task) (struct rq *rq, struct task_struct *p, bool preempt); | ||
| 1047 | |||
| 1048 | void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int flags); | ||
| 1049 | |||
| 1050 | struct task_struct * (*pick_next_task) (struct rq *rq); | ||
| 1051 | void (*put_prev_task) (struct rq *rq, struct task_struct *p); | ||
| 1052 | |||
| 1053 | #ifdef CONFIG_SMP | ||
| 1054 | int (*select_task_rq)(struct task_struct *p, int sd_flag, int flags); | ||
| 1055 | void (*migrate_task_rq)(struct task_struct *p, int next_cpu); | ||
| 1056 | |||
| 1057 | void (*pre_schedule) (struct rq *this_rq, struct task_struct *task); | ||
| 1058 | void (*post_schedule) (struct rq *this_rq); | ||
| 1059 | void (*task_waking) (struct task_struct *task); | ||
| 1060 | void (*task_woken) (struct rq *this_rq, struct task_struct *task); | ||
| 1061 | |||
| 1062 | void (*set_cpus_allowed)(struct task_struct *p, | ||
| 1063 | const struct cpumask *newmask); | ||
| 1064 | |||
| 1065 | void (*rq_online)(struct rq *rq); | ||
| 1066 | void (*rq_offline)(struct rq *rq); | ||
| 1067 | #endif | ||
| 1068 | |||
| 1069 | void (*set_curr_task) (struct rq *rq); | ||
| 1070 | void (*task_tick) (struct rq *rq, struct task_struct *p, int queued); | ||
| 1071 | void (*task_fork) (struct task_struct *p); | ||
| 1072 | |||
| 1073 | void (*switched_from) (struct rq *this_rq, struct task_struct *task); | ||
| 1074 | void (*switched_to) (struct rq *this_rq, struct task_struct *task); | ||
| 1075 | void (*prio_changed) (struct rq *this_rq, struct task_struct *task, | ||
| 1076 | int oldprio); | ||
| 1077 | |||
| 1078 | unsigned int (*get_rr_interval) (struct rq *rq, | ||
| 1079 | struct task_struct *task); | ||
| 1080 | |||
| 1081 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
| 1082 | void (*task_move_group) (struct task_struct *p, int on_rq); | ||
| 1083 | #endif | ||
| 1084 | }; | ||
| 1085 | |||
| 1086 | struct load_weight { | 920 | struct load_weight { |
| 1087 | unsigned long weight, inv_weight; | 921 | unsigned long weight, inv_weight; |
| 1088 | }; | 922 | }; |
| @@ -1274,8 +1108,10 @@ struct task_struct { | |||
| 1274 | int exit_code, exit_signal; | 1108 | int exit_code, exit_signal; |
| 1275 | int pdeath_signal; /* The signal sent when the parent dies */ | 1109 | int pdeath_signal; /* The signal sent when the parent dies */ |
| 1276 | unsigned int jobctl; /* JOBCTL_*, siglock protected */ | 1110 | unsigned int jobctl; /* JOBCTL_*, siglock protected */ |
| 1277 | /* ??? */ | 1111 | |
| 1112 | /* Used for emulating ABI behavior of previous Linux versions */ | ||
| 1278 | unsigned int personality; | 1113 | unsigned int personality; |
| 1114 | |||
| 1279 | unsigned did_exec:1; | 1115 | unsigned did_exec:1; |
| 1280 | unsigned in_execve:1; /* Tell the LSMs that the process is doing an | 1116 | unsigned in_execve:1; /* Tell the LSMs that the process is doing an |
| 1281 | * execve */ | 1117 | * execve */ |
| @@ -1327,7 +1163,7 @@ struct task_struct { | |||
| 1327 | 1163 | ||
| 1328 | cputime_t utime, stime, utimescaled, stimescaled; | 1164 | cputime_t utime, stime, utimescaled, stimescaled; |
| 1329 | cputime_t gtime; | 1165 | cputime_t gtime; |
| 1330 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING | 1166 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE |
| 1331 | struct cputime prev_cputime; | 1167 | struct cputime prev_cputime; |
| 1332 | #endif | 1168 | #endif |
| 1333 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN | 1169 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN |
| @@ -1576,6 +1412,10 @@ struct task_struct { | |||
| 1576 | #ifdef CONFIG_UPROBES | 1412 | #ifdef CONFIG_UPROBES |
| 1577 | struct uprobe_task *utask; | 1413 | struct uprobe_task *utask; |
| 1578 | #endif | 1414 | #endif |
| 1415 | #if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE) | ||
| 1416 | unsigned int sequential_io; | ||
| 1417 | unsigned int sequential_io_avg; | ||
| 1418 | #endif | ||
| 1579 | }; | 1419 | }; |
| 1580 | 1420 | ||
| 1581 | /* Future-safe accessor for struct task_struct's cpus_allowed. */ | 1421 | /* Future-safe accessor for struct task_struct's cpus_allowed. */ |
| @@ -1793,7 +1633,7 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, | |||
| 1793 | #define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */ | 1633 | #define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */ |
| 1794 | #define PF_SPREAD_PAGE 0x01000000 /* Spread page cache over cpuset */ | 1634 | #define PF_SPREAD_PAGE 0x01000000 /* Spread page cache over cpuset */ |
| 1795 | #define PF_SPREAD_SLAB 0x02000000 /* Spread some slab caches over cpuset */ | 1635 | #define PF_SPREAD_SLAB 0x02000000 /* Spread some slab caches over cpuset */ |
| 1796 | #define PF_THREAD_BOUND 0x04000000 /* Thread bound to specific cpu */ | 1636 | #define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_allowed */ |
| 1797 | #define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */ | 1637 | #define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */ |
| 1798 | #define PF_MEMPOLICY 0x10000000 /* Non-default NUMA mempolicy */ | 1638 | #define PF_MEMPOLICY 0x10000000 /* Non-default NUMA mempolicy */ |
| 1799 | #define PF_MUTEX_TESTER 0x20000000 /* Thread belongs to the rt mutex tester */ | 1639 | #define PF_MUTEX_TESTER 0x20000000 /* Thread belongs to the rt mutex tester */ |
| @@ -1927,13 +1767,13 @@ static inline int set_cpus_allowed_ptr(struct task_struct *p, | |||
| 1927 | } | 1767 | } |
| 1928 | #endif | 1768 | #endif |
| 1929 | 1769 | ||
| 1930 | #ifdef CONFIG_NO_HZ | 1770 | #ifdef CONFIG_NO_HZ_COMMON |
| 1931 | void calc_load_enter_idle(void); | 1771 | void calc_load_enter_idle(void); |
| 1932 | void calc_load_exit_idle(void); | 1772 | void calc_load_exit_idle(void); |
| 1933 | #else | 1773 | #else |
| 1934 | static inline void calc_load_enter_idle(void) { } | 1774 | static inline void calc_load_enter_idle(void) { } |
| 1935 | static inline void calc_load_exit_idle(void) { } | 1775 | static inline void calc_load_exit_idle(void) { } |
| 1936 | #endif /* CONFIG_NO_HZ */ | 1776 | #endif /* CONFIG_NO_HZ_COMMON */ |
| 1937 | 1777 | ||
| 1938 | #ifndef CONFIG_CPUMASK_OFFSTACK | 1778 | #ifndef CONFIG_CPUMASK_OFFSTACK |
| 1939 | static inline int set_cpus_allowed(struct task_struct *p, cpumask_t new_mask) | 1779 | static inline int set_cpus_allowed(struct task_struct *p, cpumask_t new_mask) |
| @@ -2019,10 +1859,17 @@ extern void idle_task_exit(void); | |||
| 2019 | static inline void idle_task_exit(void) {} | 1859 | static inline void idle_task_exit(void) {} |
| 2020 | #endif | 1860 | #endif |
| 2021 | 1861 | ||
| 2022 | #if defined(CONFIG_NO_HZ) && defined(CONFIG_SMP) | 1862 | #if defined(CONFIG_NO_HZ_COMMON) && defined(CONFIG_SMP) |
| 2023 | extern void wake_up_idle_cpu(int cpu); | 1863 | extern void wake_up_nohz_cpu(int cpu); |
| 2024 | #else | 1864 | #else |
| 2025 | static inline void wake_up_idle_cpu(int cpu) { } | 1865 | static inline void wake_up_nohz_cpu(int cpu) { } |
| 1866 | #endif | ||
| 1867 | |||
| 1868 | #ifdef CONFIG_NO_HZ_FULL | ||
| 1869 | extern bool sched_can_stop_tick(void); | ||
| 1870 | extern u64 scheduler_tick_max_deferment(void); | ||
| 1871 | #else | ||
| 1872 | static inline bool sched_can_stop_tick(void) { return false; } | ||
| 2026 | #endif | 1873 | #endif |
| 2027 | 1874 | ||
| 2028 | #ifdef CONFIG_SCHED_AUTOGROUP | 1875 | #ifdef CONFIG_SCHED_AUTOGROUP |
| @@ -2412,27 +2259,18 @@ static inline void threadgroup_change_end(struct task_struct *tsk) | |||
| 2412 | * | 2259 | * |
| 2413 | * Lock the threadgroup @tsk belongs to. No new task is allowed to enter | 2260 | * Lock the threadgroup @tsk belongs to. No new task is allowed to enter |
| 2414 | * and member tasks aren't allowed to exit (as indicated by PF_EXITING) or | 2261 | * and member tasks aren't allowed to exit (as indicated by PF_EXITING) or |
| 2415 | * perform exec. This is useful for cases where the threadgroup needs to | 2262 | * change ->group_leader/pid. This is useful for cases where the threadgroup |
| 2416 | * stay stable across blockable operations. | 2263 | * needs to stay stable across blockable operations. |
| 2417 | * | 2264 | * |
| 2418 | * fork and exit paths explicitly call threadgroup_change_{begin|end}() for | 2265 | * fork and exit paths explicitly call threadgroup_change_{begin|end}() for |
| 2419 | * synchronization. While held, no new task will be added to threadgroup | 2266 | * synchronization. While held, no new task will be added to threadgroup |
| 2420 | * and no existing live task will have its PF_EXITING set. | 2267 | * and no existing live task will have its PF_EXITING set. |
| 2421 | * | 2268 | * |
| 2422 | * During exec, a task goes and puts its thread group through unusual | 2269 | * de_thread() does threadgroup_change_{begin|end}() when a non-leader |
| 2423 | * changes. After de-threading, exclusive access is assumed to resources | 2270 | * sub-thread becomes a new leader. |
| 2424 | * which are usually shared by tasks in the same group - e.g. sighand may | ||
| 2425 | * be replaced with a new one. Also, the exec'ing task takes over group | ||
| 2426 | * leader role including its pid. Exclude these changes while locked by | ||
| 2427 | * grabbing cred_guard_mutex which is used to synchronize exec path. | ||
| 2428 | */ | 2271 | */ |
| 2429 | static inline void threadgroup_lock(struct task_struct *tsk) | 2272 | static inline void threadgroup_lock(struct task_struct *tsk) |
| 2430 | { | 2273 | { |
| 2431 | /* | ||
| 2432 | * exec uses exit for de-threading nesting group_rwsem inside | ||
| 2433 | * cred_guard_mutex. Grab cred_guard_mutex first. | ||
| 2434 | */ | ||
| 2435 | mutex_lock(&tsk->signal->cred_guard_mutex); | ||
| 2436 | down_write(&tsk->signal->group_rwsem); | 2274 | down_write(&tsk->signal->group_rwsem); |
| 2437 | } | 2275 | } |
| 2438 | 2276 | ||
| @@ -2445,7 +2283,6 @@ static inline void threadgroup_lock(struct task_struct *tsk) | |||
| 2445 | static inline void threadgroup_unlock(struct task_struct *tsk) | 2283 | static inline void threadgroup_unlock(struct task_struct *tsk) |
| 2446 | { | 2284 | { |
| 2447 | up_write(&tsk->signal->group_rwsem); | 2285 | up_write(&tsk->signal->group_rwsem); |
| 2448 | mutex_unlock(&tsk->signal->cred_guard_mutex); | ||
| 2449 | } | 2286 | } |
| 2450 | #else | 2287 | #else |
| 2451 | static inline void threadgroup_change_begin(struct task_struct *tsk) {} | 2288 | static inline void threadgroup_change_begin(struct task_struct *tsk) {} |
| @@ -2622,6 +2459,47 @@ static inline int spin_needbreak(spinlock_t *lock) | |||
| 2622 | } | 2459 | } |
| 2623 | 2460 | ||
| 2624 | /* | 2461 | /* |
| 2462 | * Idle thread specific functions to determine the need_resched | ||
| 2463 | * polling state. We have two versions, one based on TS_POLLING in | ||
| 2464 | * thread_info.status and one based on TIF_POLLING_NRFLAG in | ||
| 2465 | * thread_info.flags | ||
| 2466 | */ | ||
| 2467 | #ifdef TS_POLLING | ||
| 2468 | static inline int tsk_is_polling(struct task_struct *p) | ||
| 2469 | { | ||
| 2470 | return task_thread_info(p)->status & TS_POLLING; | ||
| 2471 | } | ||
| 2472 | static inline void current_set_polling(void) | ||
| 2473 | { | ||
| 2474 | current_thread_info()->status |= TS_POLLING; | ||
| 2475 | } | ||
| 2476 | |||
| 2477 | static inline void current_clr_polling(void) | ||
| 2478 | { | ||
| 2479 | current_thread_info()->status &= ~TS_POLLING; | ||
| 2480 | smp_mb__after_clear_bit(); | ||
| 2481 | } | ||
| 2482 | #elif defined(TIF_POLLING_NRFLAG) | ||
| 2483 | static inline int tsk_is_polling(struct task_struct *p) | ||
| 2484 | { | ||
| 2485 | return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); | ||
| 2486 | } | ||
| 2487 | static inline void current_set_polling(void) | ||
| 2488 | { | ||
| 2489 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
| 2490 | } | ||
| 2491 | |||
| 2492 | static inline void current_clr_polling(void) | ||
| 2493 | { | ||
| 2494 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
| 2495 | } | ||
| 2496 | #else | ||
| 2497 | static inline int tsk_is_polling(struct task_struct *p) { return 0; } | ||
| 2498 | static inline void current_set_polling(void) { } | ||
| 2499 | static inline void current_clr_polling(void) { } | ||
| 2500 | #endif | ||
| 2501 | |||
| 2502 | /* | ||
| 2625 | * Thread group CPU time accounting. | 2503 | * Thread group CPU time accounting. |
| 2626 | */ | 2504 | */ |
| 2627 | void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times); | 2505 | void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times); |
| @@ -2681,28 +2559,7 @@ extern long sched_setaffinity(pid_t pid, const struct cpumask *new_mask); | |||
| 2681 | extern long sched_getaffinity(pid_t pid, struct cpumask *mask); | 2559 | extern long sched_getaffinity(pid_t pid, struct cpumask *mask); |
| 2682 | 2560 | ||
| 2683 | #ifdef CONFIG_CGROUP_SCHED | 2561 | #ifdef CONFIG_CGROUP_SCHED |
| 2684 | |||
| 2685 | extern struct task_group root_task_group; | 2562 | extern struct task_group root_task_group; |
| 2686 | |||
| 2687 | extern struct task_group *sched_create_group(struct task_group *parent); | ||
| 2688 | extern void sched_online_group(struct task_group *tg, | ||
| 2689 | struct task_group *parent); | ||
| 2690 | extern void sched_destroy_group(struct task_group *tg); | ||
| 2691 | extern void sched_offline_group(struct task_group *tg); | ||
| 2692 | extern void sched_move_task(struct task_struct *tsk); | ||
| 2693 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
| 2694 | extern int sched_group_set_shares(struct task_group *tg, unsigned long shares); | ||
| 2695 | extern unsigned long sched_group_shares(struct task_group *tg); | ||
| 2696 | #endif | ||
| 2697 | #ifdef CONFIG_RT_GROUP_SCHED | ||
| 2698 | extern int sched_group_set_rt_runtime(struct task_group *tg, | ||
| 2699 | long rt_runtime_us); | ||
| 2700 | extern long sched_group_rt_runtime(struct task_group *tg); | ||
| 2701 | extern int sched_group_set_rt_period(struct task_group *tg, | ||
| 2702 | long rt_period_us); | ||
| 2703 | extern long sched_group_rt_period(struct task_group *tg); | ||
| 2704 | extern int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk); | ||
| 2705 | #endif | ||
| 2706 | #endif /* CONFIG_CGROUP_SCHED */ | 2563 | #endif /* CONFIG_CGROUP_SCHED */ |
| 2707 | 2564 | ||
| 2708 | extern int task_can_switch_user(struct user_struct *up, | 2565 | extern int task_can_switch_user(struct user_struct *up, |
