scheduler fixes
Subsystems (3)
Linus,
Please pull the latest sched-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched-urgent-for-linus
# HEAD: 093e5840ae76f1082633503964d035f40ed0216d sched/core: Reset task's lockless wake-queues on fork()
Misc scheduler fixes.
Thanks,
Ingo
------------------>
Andrey Ryabinin (1):
sched/fair: Fix multiplication overflow on 32-bit systems
Peter Zijlstra (1):
sched/core: Fix unserialized r-m-w scribbling stuff
Sebastian Andrzej Siewior (1):
sched/core: Reset task's lockless wake-queues on fork()
Sergey Senozhatsky (1):
sched/core: Check tgid in is_global_init()
include/linux/sched.h | 16 +++++++++------- kernel/fork.c | 1 + kernel/sched/fair.c | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-)
include/linux/sched.h +9 -7
@@ -1455,14 +1455,15 @@ struct task_struct {/* Used for emulating ABI behavior of previous Linux versions */ unsigned int personality; - unsigned in_execve:1; /* Tell the LSMs that the process is doing an -* execve */ - unsigned in_iowait:1; - -/* Revert to default priority/policy when forking */ +/* scheduler bits, serialized by scheduler locks */ unsigned sched_reset_on_fork:1; unsigned sched_contributes_to_load:1; unsigned sched_migrated:1; + unsigned :0; /* force alignment to the next boundary */ + +/* unserialized, strictly 'current' */ + unsigned in_execve:1; /* bit to tell LSMs we're in execve */ + unsigned in_iowait:1;#ifdef CONFIG_MEMCG unsigned memcg_may_oom:1;#endif
@@ -2002,7 +2003,8 @@ static inline int pid_alive(const struct task_struct *p) }/** -* is_global_init - check if a task structure is init +* is_global_init - check if a task structure is init. Since init +* is free to have sub-threads we need to check tgid. * @tsk: Task structure to be checked. * * Check if a task structure is the first user space task the kernel created.
@@ -2011,7 +2013,7 @@ static inline int pid_alive(const struct task_struct *p)*/ static inline int is_global_init (struct task_struct *tsk) { -return tsk->pid ==1 ; +return task_tgid_nr (tsk) ==1 ; }extern struct pid *cad_pid;
kernel/fork.c +1 -0
@@ -380,6 +380,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)#endif tsk->splice_pipe =NULL ; tsk->task_frag.page =NULL ; + tsk->wake_q.next =NULL ;account_kernel_stack (ti,1 );
kernel/sched/fair.c +1 -1
@@ -2689,7 +2689,7 @@ static inline int update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq)int decayed, removed =0 ;if (atomic_long_read (&cfs_rq->removed_load_avg)) { -long r =atomic_long_xchg (&cfs_rq->removed_load_avg,0 ); +s64 r =atomic_long_xchg (&cfs_rq->removed_load_avg,0 ); sa->load_avg =max_t (long, sa->load_avg - r,0 ); sa->load_sum =max_t (s64, sa->load_sum - r *LOAD_AVG_MAX ,0 ); removed =1 ;