Messages in this thread | | | Date | Mon, 23 Jun 2014 16:21:39 +0200 | From | Peter Zijlstra <> | Subject | Re: [PATCH 3/3] sched: Rework check_for_tasks() |
| |
On Mon, Jun 23, 2014 at 02:52:18PM +0400, Kirill Tkhai wrote: > > Then again, I suppose anything without rq->lock can and will miss tasks. > > If we use rq->lock it's possible to move check_for_tasks() to kernel/sched/core.c. > > And we can leave TASK_RUNNING check for waking tasks. Maybe something like this? > > static inline void check_for_tasks(int dead_cpu) > { > struct task_struct *g, *p; > struct rq *rq = cpu_rq(dead_cpu); > > read_lock_irq(&tasklist_lock); > raw_spin_lock(&rq->lock) > > do_each_thread(g, p) { > if (!p->on_rq && p->state != TASK_RUNNING) > continue; > if (task_cpu(p) != dead_cpu) > continue; > > pr_warn("Task %s (pid=%d) is on cpu %d (state=%ld, flags=%x)\n", > p->comm, task_pid_nr(p), dead_cpu, p->state, p->flags); > } while_each_thread(g, p); > > raw_spin_unlock(&rq->lock) > read_unlock_irq(&tasklist_lock); > } > > It still does not give a 100% guarantee... Should we take p->pi_lock for every task?
seeing how rq->lock nests inside of ->pi_lock that's going to be somewhat icky.
I think we can live with a false negative, given how much people run this nonsense it'll trigger eventually.
False positives would be bad though :-)
So I think we can keep your original (lock-free) proposal.
| |