On Wed, 2016-05-18 at 12:58 -0700, Jason Low wrote:Yes, I am aware of that. I just don't have the time to to do a mutex patch yet. As you have sent out a patch on that, this is now covered.
On Wed, 2016-05-18 at 14:29 -0400, Waiman Long wrote:By the way, this potential "partial write" issue may also apply to
On 05/18/2016 01:21 PM, Jason Low wrote:Right, although there are still places like the init function where
On Wed, 2016-05-18 at 07:04 -0700, Davidlohr Bueso wrote:Using READ_ONCE() does have a bit of cost as it limits compiler
On Tue, 17 May 2016, Waiman Long wrote:It might be okay to leave out READ_ONCE() for reading rwsem->owner, but
Without using WRITE_ONCE(), the compiler can potentially break a
write into multiple smaller ones (store tearing). So a read from the
same data by another task concurrently may return a partial result.
This can result in a kernel crash if the data is a memory address
that is being dereferenced.
This patch changes all write to rwsem->owner to use WRITE_ONCE()
to make sure that store tearing will not happen. READ_ONCE() may
not be needed for rwsem->owner as long as the value is only used for
comparison and not dereferencing.
couldn't we include it to at least document that we're performing a
"special" lockless read?
optimization. If we changes all access to rwsem->owner to READ_ONCE()
and WRITE_ONCE(), we may as well change its type to volatile and be done
with.
WRITE_ONCE isn't necessary.
I am not against doing that, but it feels a bit over-reach for me.It should be fine to use the standard READ_ONCE here, even if it's just
On the other hand, we may define a do-nothing macro that designates the
owner as a special variable for documentation purpose, but don't need
protection at that particular call site.
for documentation, as it's probably not going to cost anything in
practice. It would be better to avoid adding any special macros for this
which may just add more complexity.
mutexes as well, so we should also make a similar change to
mutex_set_owner() and mutex_clear_owner().
Jason