Commit ffbcbfca authored by Linus Torvalds's avatar Linus Torvalds

Merge branches 'sched-urgent-for-linus' and 'core-urgent-for-linus' of...

Merge branches 'sched-urgent-for-linus' and 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull stack vmap fixups from Thomas Gleixner:
 "Two small patches related to sched_show_task():

   - make sure to hold a reference on the task stack while accessing it

   - remove the thread_saved_pc printout

  .. and add a sanity check into release_task_stack() to catch problems
  with task stack references"

* 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  sched/core: Remove pointless printout in sched_show_task()
  sched/core: Fix oops in sched_show_task()

* 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  fork: Add task stack refcounting sanity check and prevent premature task stack freeing
...@@ -315,6 +315,9 @@ static void account_kernel_stack(struct task_struct *tsk, int account) ...@@ -315,6 +315,9 @@ static void account_kernel_stack(struct task_struct *tsk, int account)
static void release_task_stack(struct task_struct *tsk) static void release_task_stack(struct task_struct *tsk)
{ {
if (WARN_ON(tsk->state != TASK_DEAD))
return; /* Better to leak the stack than to free prematurely */
account_kernel_stack(tsk, -1); account_kernel_stack(tsk, -1);
arch_release_thread_stack(tsk->stack); arch_release_thread_stack(tsk->stack);
free_thread_stack(tsk); free_thread_stack(tsk);
...@@ -1862,6 +1865,7 @@ static __latent_entropy struct task_struct *copy_process( ...@@ -1862,6 +1865,7 @@ static __latent_entropy struct task_struct *copy_process(
atomic_dec(&p->cred->user->processes); atomic_dec(&p->cred->user->processes);
exit_creds(p); exit_creds(p);
bad_fork_free: bad_fork_free:
p->state = TASK_DEAD;
put_task_stack(p); put_task_stack(p);
free_task(p); free_task(p);
fork_out: fork_out:
......
...@@ -5192,21 +5192,14 @@ void sched_show_task(struct task_struct *p) ...@@ -5192,21 +5192,14 @@ void sched_show_task(struct task_struct *p)
int ppid; int ppid;
unsigned long state = p->state; unsigned long state = p->state;
if (!try_get_task_stack(p))
return;
if (state) if (state)
state = __ffs(state) + 1; state = __ffs(state) + 1;
printk(KERN_INFO "%-15.15s %c", p->comm, printk(KERN_INFO "%-15.15s %c", p->comm,
state < sizeof(stat_nam) - 1 ? stat_nam[state] : '?'); state < sizeof(stat_nam) - 1 ? stat_nam[state] : '?');
#if BITS_PER_LONG == 32
if (state == TASK_RUNNING)
printk(KERN_CONT " running ");
else
printk(KERN_CONT " %08lx ", thread_saved_pc(p));
#else
if (state == TASK_RUNNING) if (state == TASK_RUNNING)
printk(KERN_CONT " running task "); printk(KERN_CONT " running task ");
else
printk(KERN_CONT " %016lx ", thread_saved_pc(p));
#endif
#ifdef CONFIG_DEBUG_STACK_USAGE #ifdef CONFIG_DEBUG_STACK_USAGE
free = stack_not_used(p); free = stack_not_used(p);
#endif #endif
...@@ -5221,6 +5214,7 @@ void sched_show_task(struct task_struct *p) ...@@ -5221,6 +5214,7 @@ void sched_show_task(struct task_struct *p)
print_worker_info(KERN_INFO, p); print_worker_info(KERN_INFO, p);
show_stack(p, NULL); show_stack(p, NULL);
put_task_stack(p);
} }
void show_state_filter(unsigned long state_filter) void show_state_filter(unsigned long state_filter)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment