On Tue, Jul 9, 2024, at 20:27, Jeff Layton wrote:
On Tue, 2024-07-09 at 19:06 +0200, Arnd Bergmann wrote:
On Tue, Jul 9, 2024, at 17:27, Jeff Layton wrote:
On Tue, 2024-07-09 at 17:07 +0200, Arnd Bergmann wrote:
Yes, I had considered it on an earlier draft, but my attempt was pretty
laughable. You inspired me to take another look though...
If we go that route, what I think we'd want to do is add a new floor
value to the timekeeper and a couple of new functions:
ktime_get_coarse_floor - fetch the max of current coarse time and floor
ktime_get_fine_floor - fetch a fine-grained time and update the floor
I was thinking of keeping a name that is specific to the vfs
usage instead of the ktime_get_* namespace. I'm sure the timekeeping
maintainers will have an opinion on this though, one way or another.
The variety of different offsets inside the existing timekeeper code is
a bit bewildering, but I guess we'd want ktime_get_fine_floor to call
timekeeping_get_ns(&tk->tkr_mono) and keep the latest return cached.
When the coarse time is updated we'd zero out that cached floor value.
Why not update the cached value during the timekeeping update as well
instead of setting it to zero? That way you can just always use the
cached value for VFS and simplify the common code path for reading
that value.
Updating that value in ktime_get_fine_floor will require locking or
(more likely) some sort of atomic op. timekeeping_get_ns returns u64
though, so I think we're still stuck needing to do a cmpxchg64.
Right, or atomic64_cmpxchg() to make it work on 32-bit.
Arnd