On Tue, Oct 13, 2015 at 04:50:25PM -0400, Waiman Long wrote:
On 10/13/2015 03:56 PM, Peter Zijlstra wrote:Well, you already put the branch in there, the only difference here is
So the below is exactly duplicated from the normal slowpath, so whyYes, it is largely the same. I thought that you don't like too much change
don't you keep that there?
It would get you something like:
if (pv_wait_head_or_steal(..))
goto stolen;
stolen:
+ /*release:
+ * contended path; wait for next, release.
+ */
+ while (!(next = READ_ONCE(node->next)))
+ cpu_relax();
+
+ arch_mcs_spin_unlock_contended(&next->locked);
+ pv_kick_node(lock, next);
...
in the logic flow of the generic qspinlock code. I will make the change in
the next revision.
an 'extra' label. OTOH that extra label avoids duplicating some hairy
code. So over all I would say its a definite win.
And its easy to see it will compile away on the native case where:
#define pv_wait_head_or_steal(l, n, t) (false)