On 7/17/19 3:44 AM, Peter Zijlstra wrote: > 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. >> */ Yes, you are right. Thanks for the correction. Cheers, Longman