Re: [PATCH v3 3/5] locking/qspinlock: Introduce CNA into the slow path of qspinlock
From: Peter Zijlstra
Date: Wed Jul 17 2019 - 03:45:07 EST
On Tue, Jul 16, 2019 at 10:16:29PM -0400, Waiman Long wrote:
> A simple graphic to illustrate those queues will help too, for example
Very much yes!
> /*
> * MCS lock holder
> * ===============
> * mcs_node
> * +--------+ +----+ +----+
> * | next | ---> |next| -> ... |next| -> NULL [Main queue]
> * | locked | -+ +----+ +----+
> * +--------+ |
> * | +----+ +----+
> * +-> |next| -> ... |next| -> X [Secondary queue]
> * cna_node +----+ +----+
> * +--------* ^
> * | tail | ----------------------+
> * +--------*
Almost; IIUC that cna_node is the same as the one from locked, so you
end up with something like:
> * mcs_node
> * +--------+ +----+ +----+
> * | next | ---> |next| -> ... |next| -> NULL [Main queue]
> * | locked | -+ +----+ +----+
> * +--------+ |
> * | +---------+ +----+
> * +-> |mcs::next| -> ... |next| -> NULL [Secondary queue]
> * |cna::tail| -+ +----+
> * +---------+ | ^
> * +--------+
> *
> * N.B. locked = 1 if secondary queue is absent.
> */