@@ -53,6 +53,7 @@ static union
5353 uint8_t raw [RT_VDSO_DATA_PAGE_COUNT * ARCH_PAGE_SIZE ];
5454} rt_vdso_data_page_store RT_VDSO_DATA_PAGE_ALIGNED ;
5555struct rt_vdso_data_page * rt_vdso_kernel_data_page = & rt_vdso_data_page_store .data_page ;
56+ RT_DEFINE_HW_SPINLOCK (rt_vdso_data_page_lock );
5657static int rt_vdso_runtime_status = RT_EOK ;
5758
5859static struct timespec rt_vdso_realtime_offset ;
@@ -143,7 +144,7 @@ static int rt_vdso_read_monotonic_snapshot(struct timespec *monotonic_time,
143144
144145static void rt_vdso_update_data_page_flags (void )
145146{
146- rt_uint32_t flags = 0 ;
147+ rt_uint64_t flags = 0 ;
147148
148149 if (rt_vdso_realtime_offset_ready )
149150 {
@@ -188,11 +189,13 @@ void rt_vdso_set_realtime(const struct timespec *realtime)
188189 return ;
189190 }
190191
192+ rt_hw_spin_lock (& rt_vdso_data_page_lock );
191193 rt_vdso_data_page_write_begin (rt_vdso_kernel_data_page );
192194 rt_vdso_realtime_offset = rt_vdso_timespec_subtract (realtime , & monotonic );
193195 rt_vdso_realtime_offset_ready = RT_TRUE ;
194196 rt_vdso_store_clock_snapshot (& monotonic , counter , freq );
195197 rt_vdso_data_page_write_end (rt_vdso_kernel_data_page );
198+ rt_hw_spin_unlock (& rt_vdso_data_page_lock );
196199}
197200
198201static void * rt_vdso_map_physical_pages (struct rt_lwp * lwp , void * user_va ,
@@ -309,9 +312,11 @@ void rt_vdso_sync_clock_data(void)
309312 return ;
310313 }
311314
315+ rt_hw_spin_lock (& rt_vdso_data_page_lock );
312316 rt_vdso_data_page_write_begin (rt_vdso_kernel_data_page );
313317 rt_vdso_store_clock_snapshot (& monotonic , counter , freq );
314318 rt_vdso_data_page_write_end (rt_vdso_kernel_data_page );
319+ rt_hw_spin_unlock (& rt_vdso_data_page_lock );
315320}
316321
317322static int rt_vdso_validate_image (void )
0 commit comments