hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/kernel/time/vsyscall.c
....@@ -69,15 +69,41 @@
6969 vdso_ts->nsec = tk->tkr_mono.xtime_nsec;
7070 }
7171
72
+static void update_generic_mmio(struct vdso_data *vdata, struct timekeeper *tk)
73
+{
74
+#ifdef CONFIG_GENERIC_CLOCKSOURCE_VDSO
75
+ const struct clocksource *cs = tk->tkr_mono.clock;
76
+ u16 seq;
77
+
78
+ if (cs->vdso_type == (vdata->cs_type_seq >> 16))
79
+ return;
80
+
81
+ seq = vdata->cs_type_seq;
82
+ if (++seq == 0)
83
+ seq = 1;
84
+
85
+ vdata->cs_type_seq = cs->vdso_type << 16 | seq;
86
+
87
+ if (cs->vdso_type >= CLOCKSOURCE_VDSO_MMIO)
88
+ snprintf(vdata->cs_mmdev, sizeof(vdata->cs_mmdev),
89
+ "/dev/ucs/%u", cs->vdso_type - CLOCKSOURCE_VDSO_MMIO);
90
+#endif
91
+}
92
+
7293 void update_vsyscall(struct timekeeper *tk)
7394 {
7495 struct vdso_data *vdata = __arch_get_k_vdso_data();
7596 struct vdso_timestamp *vdso_ts;
97
+ unsigned long flags;
7698 s32 clock_mode;
7799 u64 nsec;
78100
101
+ flags = hard_cond_local_irq_save();
102
+
79103 /* copy vsyscall data */
80104 vdso_write_begin(vdata);
105
+
106
+ update_generic_mmio(vdata, tk);
81107
82108 clock_mode = tk->tkr_mono.clock->vdso_clock_mode;
83109 vdata[CS_HRES_COARSE].clock_mode = clock_mode;
....@@ -110,13 +136,16 @@
110136 * If the current clocksource is not VDSO capable, then spare the
111137 * update of the high reolution parts.
112138 */
113
- if (clock_mode != VDSO_CLOCKMODE_NONE)
139
+ if (IS_ENABLED(CONFIG_GENERIC_CLOCKSOURCE_VDSO) ||
140
+ clock_mode != VDSO_CLOCKMODE_NONE)
114141 update_vdso_data(vdata, tk);
115142
116143 __arch_update_vsyscall(vdata, tk);
117144
118145 vdso_write_end(vdata);
119146
147
+ hard_cond_local_irq_restore(flags);
148
+
120149 __arch_sync_vdso_data(vdata);
121150 }
122151