Re: [PATCH] RDMA/siw: Reuse value read using READ_ONCE instead of re-reading it

From: Zhu Yanjun
Date: Mon Mar 11 2024 - 01:12:13 EST


在 2024/3/11 3:34, linke li 写道:
If value can change between subsequent reads, then you need to use locks
to make sure that it doesn't happen. Using READ_ONCE() doesn't solve the
concurrency issue, but makes sure that compiler doesn't reorder reads
and writes.

This code do not need to prevent other thread from writing on the flags.

This topic got quite a bit of discussion [1], quote from it:

(READ_ONCE and WRITE_ONCE)
That's often useful - lots of code doesn't really care if you get the
old or the new value, but the code *does* care that it gets *one*
value, and not some random mix of "I tested one value for validity,
then it got reloaded due to register pressure, and I actually used
another value".

And not some "I read one value, and it was a mix of two other values".
From the original code, the first read seems to do the same things. So
READ_ONCE is probably ok here.

I just want to make sure the flags stored to wqe->sqe.flags is consistent
with the read used in the if condition.

Sure. Follow Leon's advice, to make this ("wqe->sqe.flags is consistent with the read used in the if condition") happen, you need a lock to ensure it. The lock can be spin lock or mutex lock depens on its sleeping or not.

From the original source code, wqe->sqe.flags should be a volatile variable. It should be read from the original source, not from cache.

Zhu Yanjun


[1]https://lore.kernel.org/lkml/CAHk-=wgG6Dmt1JTXDbrbXh_6s2yLjL=9pHo7uv0==LHFD+aBtg@xxxxxxxxxxxxxx/