On 09/23/2016 09:28 PM, Davidlohr Bueso wrote:
+#ifdef CONFIG_RT_MUTEX_SPIN_ON_OWNER +static bool rt_mutex_spin_on_owner(struct rt_mutex *lock, + struct task_struct *owner) +{ + bool ret = true; + + /* + * The last owner could have just released the lock, + * immediately try taking it again. + */ + if (!owner) + goto done; + + rcu_read_lock(); + while (rt_mutex_owner(lock) == owner) { + /* + * Ensure we emit the owner->on_cpu, dereference _after_ + * checking lock->owner still matches owner. If that fails, + * owner might point to freed memory. If it still matches, + * the rcu_read_lock() ensures the memory stays valid. + */ + barrier(); + if (!owner->on_cpu || need_resched()) { + ret = false; + break; + } + + cpu_relax_lowlatency(); + } + rcu_read_unlock(); +done: + return ret; +} +
One issue that I saw is that the spinner may no longer be the top waiter while spinning. Should we also check this condition in the spin loop?
Cheers, Longman