On Wed, Apr 10, 2013 at 12:27 AM, Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > On Thu, Apr 04, 2013 at 06:38:36PM +0200, Peter Zijlstra wrote: >> On Thu, 2013-04-04 at 15:31 +0200, Daniel Vetter wrote: >> > Hm, I guess your aim with the TASK_DEADLOCK wakeup is to bound the >> > wait >> > times of older task. >> >> No, imagine the following: >> >> struct ww_mutex A, B; >> struct mutex C; >> >> task-O task-Y task-X >> A >> B >> C >> C >> B >> >> At this point O finds that Y owns B and thus we want to make Y 'yield' >> B to make allow B progress. Since Y is blocked, we'll send a wakeup. >> However Y is blocked on a different locking primitive; one that doesn't >> collaborate in the -EDEADLK scheme therefore we don't want the wakeup to >> succeed. > > I'm confused to why the above is a problem. Task-X will eventually > release C, and then Y will release B and O will get to continue. Do we > have to drop them once the owner is blocked? Can't we follow the chain > like the PI code does? Just waiting until every task already holding a lock completes and unlucks it is indeed a viable solution - it's the currently implemented algorithm in ttm and Maarten's current patches. The nice thing with Peter's wakeup idea on top is: - It bounds blocked times. - And (at least I think so) it's the key thing making PI boosting possible without any ugly PI inversion deadlocks happening. See Message-ID: <CAKMK7uEUdtiDDCRPwpiumkrST6suFY7YuQcPAXR_nJ0XHKzsAw@xxxxxxxxxxxxxx> for my current reasoning about this (I have not yet managed to poke a hole into it). -Daniel -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel