[Xenomai] error / bugfix in ipipe-core-3-10.28-powerpc-1.patch (from eldk 5.5, company denx)

Ralf ralf.moder at mail.de
Mon Apr 14 08:55:37 CEST 2014


Am 28.03.2014 08:39, schrieb Ralf:
> Hello,
>
> i have found an error in the ipipe-patch above.
> Here ist the error description:
>
> Our system:
> Linux 3.10.28 with xenomai 2.6 patch on a PowerPC MPC5200
>
> Error description:
> We use the xenomai-(posix-skin-)function clock_gettime(
> CLOCK_HOST_REALTIME, ..) to read out our system time. Thus, we set up a
> NTP clock that runs on an FPGA. Later, we compare the system time and
> NTP time deviations. Unfortunately we recognize in any comparison with
> the nanoseconds a deviation of at least 100 million nsecs. We then
> started the xenomai test suite and get the following prints on our console:
>
> root at hbm-000a0f(NFS):/$clocktest -D -C
> 42                                      
> hostrt data area is
> live                                                       
> Sequence counter :
> 92323948                                                    
> wall_time_sec    :
> 1395909476                                                  
> wall_time_nsec   :
> 49                                                          
> wall_to_monotonic                                                              
>
> tv_sec : -1395754171                                                 
> tv_nsec : 750313156                                                   
> cycle_last       :
> 5127088924084                                               
> mask             :
> 0xffffffffffffffff                                          
> mult             :
> 508284933                                                   
> shift            :
> 24                                                          
>                                                                                
>
> == Tested clock: 42
> (CLOCK_HOST_REALTIME)                                      
> CPU      ToD offset [us] ToD drift [us/s]      warps max delta
> [us]            
> --- -------------------- ---------------- ----------
> --------------            
>   0            -990145.8       -11538.531       2740         6253.3
>
> As you can see, only 8 bits of the nanosecond value (wall_time_nsec)
> will be displayed. Instrumentation (printks) has shown that these are
> the most significant 8 bits of the value.
>
> Reason:
> The function tk_xtime(struct timekeeper *tk) (in file
> include/linux/timekeeper_internal.h)
>
> static inline struct timespec tk_xtime(struct timekeeper *tk)
> {
>     struct timespec ts;
>
>     ts.tv_sec = tk->xtime_sec;
>     ts.tv_nsec = (long)(tk->xtime_nsec >> tk->shift);
>     return ts;
> }
>
> is applied twice to the system time. First in this function (in file
> include/linux/timekeeper_internal.h):
>
> static inline void update_vsyscall(struct timekeeper *tk)
> {
>     struct timespec xt;
>
>     xt = tk_xtime(tk);
>     update_vsyscall_old(&xt, &tk->wall_to_monotonic, tk->clock, tk->mult);
> }
>
> and then in this function (in file /kernel/ipipe/timer.c):
>
> void ipipe_update_hostrt(struct timekeeper *tk)
> {
>     struct ipipe_hostrt_data data;
>     struct timespec xt;
>
>     xt = tk_xtime(tk);
>     ipipe_root_only();
>     data.live = 1;
>     data.cycle_last = tk->clock->cycle_last;
>     data.mask = tk->clock->mask;
>     data.mult = tk->mult;
>     data.shift = tk->shift;
>     data.wall_time_sec = xt.tv_sec;
>     data.wall_time_nsec = xt.tv_nsec;
>     data.wall_to_monotonic = tk->wall_to_monotonic;
>     __ipipe_notify_kevent(IPIPE_KEVT_HOSTRT, &data);
> }
>
> tk_xtime() makes a shift to the right on the nanoseconds. This shift is
> at our clock source 24. If this shift now run twice consecutively, that
> explains naturally why we only get the most significant 8 bits of the
> nanosecond value.
>
> a fix that might solve the problem, looks like this
>
> void ipipe_update_hostrt(struct timekeeper *tk)
> {
>     struct ipipe_hostrt_data data;
>     struct timespec xt;
>
> //     xt = tk_xtime(tk);
>     ipipe_root_only();
>     data.live = 1;
>     data.cycle_last = tk->clock->cycle_last;
>     data.mask = tk->clock->mask;
>     data.mult = tk->mult;
>     data.shift = tk->shift;
>     data.wall_time_sec = tk->xtime_sec;
>     data.wall_time_nsec = (long)tk->xtime_nsec;
>     data.wall_to_monotonic = tk->wall_to_monotonic;
>     __ipipe_notify_kevent(IPIPE_KEVT_HOSTRT, &data);
> }
>
> I have successfully tested this fix on our system.
>
> Regards
>
> Ralf
>
>
> _______________________________________________
> Xenomai mailing list
> Xenomai at xenomai.org
> http://www.xenomai.org/mailman/listinfo/xenomai
>

Has anyone observed the same thing? Do you think that bugfix correct?
How can i bring it into mainline? I would be very grateful for some help.

Regards

Ralf




More information about the Xenomai mailing list