Messages in this thread | | | Date | Mon, 20 Apr 2009 17:14:14 -0400 (EDT) | From | Steven Rostedt <> | Subject | Re: [PATCH 0/4] [GIT PULL] tracing: recursion and compile fixes |
| |
On Mon, 20 Apr 2009, Frederic Weisbecker wrote:
> On Mon, Apr 20, 2009 at 04:44:46PM -0400, Steven Rostedt wrote: > > > > On Mon, 20 Apr 2009, Frederic Weisbecker wrote: > > > > > > > > > > > > > Hmm, doesn't the trace wakeup test if the runqueue lock is locked or not? > > > > > > > > -- Steve > > > > > > > > > > > > > Hmm, yes it does but that's not the first time we meet this problem > > > (sched switch event tracing recursions by the past). So either the > > > test doesn't work well or this is about another lock that > > > wake_up_common takes... > > > > Ug, it is the task's rq lock. Not the current rq lock. wakeup takes the > > runqueue lock of the task. The "runqueue_is_locked" only tests the lock of > > current CPU, which is not what we can have. > > > You mean the lock held on the wait_queue for wake_up_trace() ? > > void __wake_up(wait_queue_head_t *q, unsigned int mode, > int nr_exclusive, void *key) > { > unsigned long flags; > > spin_lock_irqsave(&q->lock, flags); > __wake_up_common(q, mode, nr_exclusive, 0, key); > spin_unlock_irqrestore(&q->lock, flags); > } >
No, I mean that we check the runqueue lock on the current CPU (there's a runqueue for each CPU). The runqueue_is_locked tests only the lock for the current cpu. But the wake up of a task grabs the runqueue of the lock the task is on.
If we are on CPU0 and hold the runqueue lock of CPU1, and we wake up a task on CPU1, we will deadlock. Even thought runqueue_is_locked passed. Because the current runqueue lock is not part of this equation.
-- Steve
| |