| .. | .. |
|---|
| 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 | |
|---|