# define VDSO_DELTA_MASK(vd)   (vd->mask)
 #endif
 
+#ifdef CONFIG_GENERIC_VDSO_OVERFLOW_PROTECT
+static __always_inline bool vdso_delta_ok(const struct vdso_data *vd, u64 delta)
+{
+       return delta < vd->max_cycles;
+}
+#else
+static __always_inline bool vdso_delta_ok(const struct vdso_data *vd, u64 delta)
+{
+       return true;
+}
+#endif
+
 #ifndef vdso_shift_ns
 static __always_inline u64 vdso_shift_ns(u64 ns, u32 shift)
 {
 {
        u64 delta = (cycles - vd->cycle_last) & VDSO_DELTA_MASK(vd);
 
-       return vdso_shift_ns((delta * vd->mult) + base, vd->shift);
+       if (likely(vdso_delta_ok(vd, delta)))
+               return vdso_shift_ns((delta * vd->mult) + base, vd->shift);
+
+       return mul_u64_u32_add_u64_shr(delta, vd->mult, base, vd->shift);
 }
 #endif /* vdso_calc_ns */