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. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/