Skip to content

Commit 602d60e

Browse files
t-8chThomas Gleixner
authored andcommitted
vdso/gettimeofday: Reload sequence counter after switch to time page in do_aux()
After switching to the real data pages, the sequence counter needs to be reloaded from there. The code using vdso_read_begin_timens() assumed this worked by 'continue' jumping to the *beginning* of the do-while retry loop. However the 'continue' jumps to the *end* of said loop, evaluating the exit condition. If the data page has a sequence counter of '1' it will match the one from the time namespace page and prematurely exit the retry loop. This would result in garbage returned to the caller. Reload the sequence counter after switching the pages by using an inner while loop again, which will loop at most once. The loop generates slightly better code than an explicit reload through 'seq = vdso_read_begin()'. Fixes: ed78b7b ("vdso/gettimeofday: Add a helper to read the sequence lock of a time namespace aware clock") Reported-by: Ricardo Ribalda <ribalda@chromium.org> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@kernel.org> Tested-by: Ricardo Ribalda <ribalda@chromium.org> Reviewed-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org> Link: https://patch.msgid.link/20260422-vdso-aux-timens-loop-v1-1-e2dd8c7164cc@linutronix.de Closes: https://lore.kernel.org/lkml/CANiDSCsOy0P1if-gJZqOM5pTJ0RDcwVfru1B7KFbTOEMqjPKJw@mail.gmail.com/
1 parent 5d69190 commit 602d60e

1 file changed

Lines changed: 2 additions & 3 deletions

File tree

lib/vdso/gettimeofday.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,11 +248,10 @@ bool do_aux(const struct vdso_time_data *vd, clockid_t clock, struct __kernel_ti
248248
vc = &vd->aux_clock_data[idx];
249249

250250
do {
251-
if (vdso_read_begin_timens(vc, &seq)) {
251+
while (vdso_read_begin_timens(vc, &seq)) {
252+
/* Re-read from the real time data page, reload seq by looping */
252253
vd = __arch_get_vdso_u_timens_data(vd);
253254
vc = &vd->aux_clock_data[idx];
254-
/* Re-read from the real time data page */
255-
continue;
256255
}
257256

258257
/* Auxclock disabled? */

0 commit comments

Comments
 (0)