Thread (33 messages) 33 messages, 5 authors, 2021-03-05

Re: XDP socket rings, and LKMM litmus tests

flat view

From: Alan Stern <stern@rowland.harvard.edu>
Date: 2021-03-04 03:14:52
Also in: lkml

On Thu, Mar 04, 2021 at 09:26:31AM +0800, Boqun Feng wrote:
On Wed, Mar 03, 2021 at 03:22:46PM -0500, Alan Stern wrote:
quoted
Which brings us back to the case of the

	dep ; rfi

dependency relation, where the accesses in the middle are plain and 
non-racy.  Should the LKMM be changed to allow this?
For this particular question, do we need to consider code as the follow?

	r1 = READ_ONCE(x);  // f
	if (r == 1) {
		local_v = &y; // g
		do_something_a();
	}
	else {
		local_v = &y;
		do_something_b();
	}

	r2 = READ_ONCE(*local_v); // e

, do we have the guarantee that the first READ_ONCE() happens before the
second one? Can compiler optimize the code as:

	r2 = READ_ONCE(y);
	r1 = READ_ONCE(x);
Well, it can't do that because the compiler isn't allowed to reorder
volatile accesses (which includes READ_ONCE).  But the compiler could
do:

	r1 = READ_ONCE(x);
	r2 = READ_ONCE(y);
	if (r == 1) {
		do_something_a();
	}
	else {
		do_something_b();
	}

? Although we have:

	f ->dep g ->rfi ->addr e
This would be an example of a problem Paul has described on several
occasions, where both arms of an "if" statement store the same value
(in this case to local_v).  This problem arises even when local
variables are not involved.  For example:

	if (READ_ONCE(x) == 0) {
		WRITE_ONCE(y, 1);
		do_a();
	} else {
		WRITE_ONCE(y, 1);
		do_b();
	}

The compiler can change this to:

	r = READ_ONCE(x);
	WRITE_ONCE(y, 1);
	if (r == 0)
		do_a();
	else
		do_b();

thus allowing the marked accesses to be reordered by the CPU and
breaking the apparent control dependency.

So the answer to your question is: No, we don't have this guarantee,
but the reason is because of doing the same store in both arms, not
because of the use of local variables.

Alan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help