Re: [PATCH v5 3/5] locking/qspinlock: Introduce CNA into the slow path of qspinlock
From: Alex Kogan <hidden>
Date: 2019-10-18 21:39:15
Also in:
linux-arch, lkml
On Oct 18, 2019, at 12:03 PM, Waiman Long [off-list ref] wrote: On 10/16/19 12:29 AM, Alex Kogan wrote:quoted
+static inline void cna_pass_lock(struct mcs_spinlock *node, + struct mcs_spinlock *next) +{ + struct cna_node *cn = (struct cna_node *)node; + struct mcs_spinlock *next_holder = next, *tail_2nd; + u32 val = 1; + + u32 scan = cn->pre_scan_result; + + /* + * check if a successor from the same numa node has not been found in + * pre-scan, and if so, try to find it in post-scan starting from the + * node where pre-scan stopped (stored in @pre_scan_result) + */ + if (scan > 0) + scan = cna_scan_main_queue(node, decode_tail(scan)); + + if (!scan) { /* if found a successor from the same numa node */ + next_holder = node->next; + /* + * make sure @val gets 1 if current holder's @locked is 0 as + * we have to store a non-zero value in successor's @locked + * to pass the lock + */ + val = node->locked + (node->locked == 0);node->locked can be 0 when the cpu enters into an empty MCS queue. We could unconditionally set node->locked to 1 for this case in qspinlock.c or with your above code.
Right, I was doing that in the first two versions of the series. It adds unnecessary store into @locked for non-CNA variants, and even if it does not have any real performance implications, I think Peter did not like that (or, at least, the comment I had to explain why we needed that store).
Perhaps, a comment about when node->locked will be 0.
Yeah, I was tinkering with this comment. Here is how it read in v3: /* * We unlock a successor by passing a non-zero value, * so set @val to 1 iff @locked is 0, which will happen * if we acquired the MCS lock when its queue was empty */ I can change back to something like that if it is better.
It may be easier to understand if you just do
val = node->locked ? node->locked : 1;You’re right, that’s another possibility. However, it adds yet another if-statement on the critical path, which I was trying to avoid that. Best regards, — Alex _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel