On Thu, Dec 01, 2016 at 03:06:45PM +0100, Nicolai Hähnle wrote: > +++ b/kernel/locking/mutex.c > @@ -350,7 +350,8 @@ ww_mutex_set_context_slowpath(struct ww_mutex *lock, > * access and not reliable. > */ > static noinline > -bool mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner) > +bool mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner, > + bool use_ww_ctx, struct ww_acquire_ctx *ww_ctx) > { > bool ret = true; > > @@ -373,6 +374,28 @@ bool mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner) > break; > } > > + if (use_ww_ctx && ww_ctx->acquired > 0) { > + struct ww_mutex *ww; > + > + ww = container_of(lock, struct ww_mutex, base); > + > + /* > + * If ww->ctx is set the contents are undefined, only > + * by acquiring wait_lock there is a guarantee that > + * they are not invalid when reading. > + * > + * As such, when deadlock detection needs to be > + * performed the optimistic spinning cannot be done. > + * > + * Check this in every inner iteration because we may > + * be racing against another thread's ww_mutex_lock. > + */ > + if (READ_ONCE(ww->ctx)) { > + ret = false; > + break; > + } > + } > + > cpu_relax(); > } > rcu_read_unlock(); Aside from the valid question about mutex_can_spin_on_owner() there's another 'problem' here, mutex_spin_on_owner() is marked noinline, so all the use_ww_ctx stuff doesn't 'work' here. As is, I think we're missing an __always_inline on mutex_optimistic_spin, I'll have to go see what that does for code generation, but given both @use_ww_ctx and @waiter there that makes sense. _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel