> On Sep 3, 2022, at 07:37, Jonathan Gray <j...@jsg.id.au> wrote: > > On Sat, Sep 03, 2022 at 06:52:20AM -0500, Scott Cheloha wrote: >>>> On Sep 3, 2022, at 02:22, Jonathan Gray <j...@jsg.id.au> wrote: >>> >>> On Fri, Sep 02, 2022 at 06:00:25PM -0500, Scott Cheloha wrote: >>>> dv@ suggested coming to the list to request testing for the pvclock(4) >>>> driver. Attached is a patch that corrects several bugs. Most of >>>> these changes will only matter in the non-TSC_STABLE case on a >>>> multiprocessor VM. >>>> >>>> Ideally, nothing should break. >>>> >>>> - pvclock yields a 64-bit value. The BSD timecounter layer can only >>>> use the lower 32 bits, but internally we need to track the full >>>> 64-bit value to allow comparisons with the full value in the >>>> non-TSC_STABLE case. So make pvclock_lastcount a 64-bit quantity. >>>> >>>> - In pvclock_get_timecount(), move rdtsc() up into the lockless read >>>> loop to get a more accurate timestamp. >>>> >>>> - In pvclock_get_timecount(), use rdtsc_lfence(), not rdtsc(). >>>> >>>> - In pvclock_get_timecount(), check that our TSC value doesn't predate >>>> ti->ti_tsc_timestamp, otherwise we will produce an enormous value. >>>> >>>> - In pvclock_get_timecount(), update pvclock_lastcount in the >>>> non-TSC_STABLE case with more care. On amd64 we can do this with an >>>> atomic_cas_ulong(9) loop because u_long is 64 bits. On i386 we need >>>> to introduce a mutex to protect our comparison and read/write. >>> >>> i386 has cmpxchg8b, no need to disable interrupts >>> the ifdefs seem excessive >> >> How do I make use of CMPXCHG8B on i386 >> in this context? >> >> atomic_cas_ulong(9) is a 32-bit CAS on >> i386. > > static inline uint64_t > atomic_cas_64(volatile uint64_t *p, uint64_t o, uint64_t n) > { > return __sync_val_compare_and_swap(p, o, n); > } > > Or md atomic.h files could have an equivalent. > Not possible on all 32-bit archs.
Gotcha. >> We can't use FP registers in the kernel, no? > > What do FP registers have to do with it? I read someplace that using FP registers was a quick and dirty way to take advantage of the 64-bit-aligned atomic access guarantees of the Pentium. >> Am I missing some other avenue? > > There is no rdtsc_lfence() on i386. Initial diff doesn't build. I will come back with a fuller patch in a bit.