Messages in this thread | | | Date | Tue, 30 Apr 2024 08:17:21 -0700 | From | Boqun Feng <> | Subject | Re: [PATCH] rust: hrtimer: introduce hrtimer support |
| |
On Tue, Apr 30, 2024 at 02:33:50PM +0200, Andreas Hindborg wrote: [...] > > > > Could you see if you can replace this with a `SpinLock<bool>` + > > `CondVar`? We shouldn't use Rust atomic in kernel now. I know it's > > unfortunate that LKMM atomics are still work in process, but in real > > world, you won't do busy waiting for a timer to fire, so a > > `CondVar::wait` is better for example purpose. > > Since this is only using the atomic from Rust code, it should be fine > right? There is no mixing of memory models on this memory location. >
It's better compared to mixing accesses on a same location, but it's still not allowed (for now, at least) to avoid mixing memory models on ordering guarantees, for example:
(assume all memory location is initialized as 0)
CPU 0 CPU 1 ----- ----- x.store(1, RELAXED); // Rust native atomic smp_store_release(&y, 1); // LKMM atomic let r0 = smp_load_acquire(&y); let r1 = x.load(RELAXED);
The smp_store_release() and smp_load_acquire() pairs per LKMM, and provide certain rel-acq ordering. But to make it (r0 == 1 && r1 == 0), C11 memory model needs to understand this sort of orderings, but currently there is no such thing as an "external ordering" to C11 memory model.
I admit this is much of a theorical concern for code reasoning, in real world, it must "just work", but "if you want to have fun, start with one" ;-)
Regards, Boqun
| |