> On 07/04/2022 11:56, gabriel.moy...@dlr.de wrote:
> >> On 07/04/2022 10:36, Gabriel Moyano wrote:
> >>> ---
> >>>    cpukit/score/src/kern_tc.c | 6 ++++++
> >>>    1 file changed, 6 insertions(+)
> >>>
> >>> diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c
> >>> index a5c7b4b841..a8ba268ea3 100644
> >>> --- a/cpukit/score/src/kern_tc.c
> >>> +++ b/cpukit/score/src/kern_tc.c
> >>> @@ -2109,9 +2109,11 @@ pps_capture(struct pps_state *pps)
> >>>           pps->capffth = fftimehands;
> >>>    #endif
> >>>           pps->capcount =
> >>> th->th_counter->tc_get_timecount(th->th_counter);
> >>> +#ifndef __rtems__
> >>>           atomic_thread_fence_acq();
> >>>           if (pps->capgen != th->th_generation)
> >>>                   pps->capgen = 0;
> >>> +#endif /* __rtems__ */
> >>>    }
> >>>
> >>>    void
> >>> @@ -2135,10 +2137,12 @@ pps_event(struct pps_state *pps, int event)
> >>>           /* Nothing to do if not currently set to capture this event 
> >>> type. */
> >>>           if ((event & pps->ppsparam.mode) == 0)
> >>>                   return;
> >>> +#ifndef __rtems__
> >>>           /* If the timecounter was wound up underneath us, bail out. */
> >>>           if (pps->capgen == 0 || pps->capgen !=
> >>>               atomic_load_acq_int(&pps->capth->th_generation))
> >>>                   return;
> >>> +#endif /* __rtems__ */
> >>>
> >>>           /* Things would be easier with arrays. */
> >>>           if (event == PPS_CAPTUREASSERT) { @@ -2189,10 +2193,12 @@
> >>> pps_event(struct pps_state *pps, int event)
> >>>           bintime_addx(&bt, pps->capth->th_scale * tcount);
> >>>           bintime2timespec(&bt, &ts);
> >>>
> >>> +#ifndef __rtems__
> >>>           /* If the timecounter was wound up underneath us, bail out. */
> >>>           atomic_thread_fence_acq();
> >>>           if (pps->capgen != pps->capth->th_generation)
> >>>                   return;
> >>> +#endif /* __rtems__ */
> >>>
> >>>           *pcount = pps->capcount;
> >>>           (*pseq)++;
> >> Why is this change justified?
> > Since only one timehands object is used, the generation is updated more 
> > frequently. This can even happen between pps_capture()
> and pps_event(), making the synchronization impossible.
> 
> It seems you didn't test with SMP configurations, since here we have two 
> timehands.
>

Yes, you are right, I didn't test it with SMP configurations (for now).
On possible solution will be to have these verifications only for SMP.
 
> Which sequence of function calls and timings cases the problem? This should 
> be definitely a test case.

The generation is updated every time tc_windup() is called. So it is more or 
less a race condition when it happens.
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to