tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: struct vnode::v_mount access rules



> Date: Thu, 3 Oct 2024 10:13:17 +0200
> From: "J. Hannken-Illjes" <hannken%mailbox.org@localhost>
> 
> > On 1. Oct 2024, at 18:57, Taylor R Campbell <campbell+netbsd-tech-kern%mumble.net@localhost> wrote:
> > 
> > I think the answer is no, nothing here precludes a concurrent
> > vcache_reclaim from writing to fp->f_vnode->v_mount at the same time
> > do_sys_fstatvfs is reading from it.  Although both the before and
> > after states are OK for dostatvfs, if this concurrent read/write is
> > supposed to be allowed, it should be done with atomic_load/store_* --
> > and the same needs to apply to all other use of v_mount that isn't,
> > e.g., serialized by the vnode lock.
> 
> Always thought while writing a pointer to aligned storage a
> concurrent reader will get either the old or the new value but
> never gets garbage.  Is this assumption wrong?

We have long made that assumption, and on all the architectures we
support that I'm aware of, it is true of a load or store instruction
executed by the CPU.

But the compiler might play other shenanigans, if you don't use
atomic_load/store_*.  It might, in principle, fuse or tear loads or
stores (mainly relevant for larger-size or misaligned load/stores).
It might, in practice, issue multiple load or store instructions on
the same location, and assume they produce the same results -- e.g.,
under register pressure, it might just load the same location twice
instead of spilling a register to the stack.

And sanitizers like tsan are apt to interpret this as a data race,
leading to false alarms even if it is otherwise harmless.

And, for the reader's sake in understanding the code, it is clearer to
use atomic_load/store_*.

So we should always use atomic_load/store_* if the intent is that the
location can be concurrently written to while we're reading from it.


Home | Main Index | Thread Index | Old Index