.. | .. |
---|
69 | 69 | vdso_ts->nsec = tk->tkr_mono.xtime_nsec; |
---|
70 | 70 | } |
---|
71 | 71 | |
---|
| 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 | + |
---|
72 | 93 | void update_vsyscall(struct timekeeper *tk) |
---|
73 | 94 | { |
---|
74 | 95 | struct vdso_data *vdata = __arch_get_k_vdso_data(); |
---|
75 | 96 | struct vdso_timestamp *vdso_ts; |
---|
| 97 | + unsigned long flags; |
---|
76 | 98 | s32 clock_mode; |
---|
77 | 99 | u64 nsec; |
---|
78 | 100 | |
---|
| 101 | + flags = hard_cond_local_irq_save(); |
---|
| 102 | + |
---|
79 | 103 | /* copy vsyscall data */ |
---|
80 | 104 | vdso_write_begin(vdata); |
---|
| 105 | + |
---|
| 106 | + update_generic_mmio(vdata, tk); |
---|
81 | 107 | |
---|
82 | 108 | clock_mode = tk->tkr_mono.clock->vdso_clock_mode; |
---|
83 | 109 | vdata[CS_HRES_COARSE].clock_mode = clock_mode; |
---|
.. | .. |
---|
110 | 136 | * If the current clocksource is not VDSO capable, then spare the |
---|
111 | 137 | * update of the high reolution parts. |
---|
112 | 138 | */ |
---|
113 | | - if (clock_mode != VDSO_CLOCKMODE_NONE) |
---|
| 139 | + if (IS_ENABLED(CONFIG_GENERIC_CLOCKSOURCE_VDSO) || |
---|
| 140 | + clock_mode != VDSO_CLOCKMODE_NONE) |
---|
114 | 141 | update_vdso_data(vdata, tk); |
---|
115 | 142 | |
---|
116 | 143 | __arch_update_vsyscall(vdata, tk); |
---|
117 | 144 | |
---|
118 | 145 | vdso_write_end(vdata); |
---|
119 | 146 | |
---|
| 147 | + hard_cond_local_irq_restore(flags); |
---|
| 148 | + |
---|
120 | 149 | __arch_sync_vdso_data(vdata); |
---|
121 | 150 | } |
---|
122 | 151 | |
---|