> -----Original Message----- > From: Arnd Bergmann [mailto:a...@arndb.de] > Sent: Thursday, January 28, 2016 7:52 PM > To: Thomas Gleixner > Cc: Zengtao (B); LKML; Frederic Weisbecker > Subject: Re: [PATCH] cputime: Fix timeval-->cputime conversion > > On Thursday 28 January 2016 09:22:04 Thomas Gleixner wrote: > > Cc'ing Arnd > > > > On Thu, 28 Jan 2016, zengtao wrote: > > > > > The structure: > > > struct timeval { > > > __kernel_time_t tv_sec; /* seconds */ > > > __kernel_suseconds_t tv_usec; /* microseconds */ > > > }; > > > both __kernel_time_t and __kernel_suseconds_t are short than u64 > > > when it is 32bit platform, so force u64 conversion here. > > > > > > Signed-off-by: zengtao <prime.z...@huawei.com> > > > > Reviewed-by: Thomas Gleixner <t...@linutronix.de> > > This seems to miss timespec_to_cputime(), which has the same problem, > so only setitimer() is fixed, but not nanosleep() or timer_settime(). Yes, I have checked the code just now, the timespec_to_cputime() has the same problem.I found the origin issue through setitimer().And I think the timespec_to_cputime() only affects timer_settime(),by which means it affects nanosleep?
> > There should probably be some explanation in which cases this happens, > my reading is that can only occur on MIPS32 and ARM32 with "Full dynticks > CPU time accounting" enabled, which is required for CONFIG_NO_HZ_FULL, > so we need this backported to any kernel that includes > 31c1fc818715 ("ARM: Kconfig: allow full nohz CPU accounting"), i.e. > v3.13 or higher, correct? Yes. > > Arnd > > > > include/asm-generic/cputime_nsecs.h | 3 ++- > > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > > > diff --git a/include/asm-generic/cputime_nsecs.h > b/include/asm-generic/cputime_nsecs.h > > > index 0419485..e2f7ff9 100644 > > > --- a/include/asm-generic/cputime_nsecs.h > > > +++ b/include/asm-generic/cputime_nsecs.h > > > @@ -91,7 +91,8 @@ static inline void cputime_to_timespec(const > cputime_t ct, struct timespec *val) > > > */ > > > static inline cputime_t timeval_to_cputime(const struct timeval *val) > > > { > > > - u64 ret = val->tv_sec * NSEC_PER_SEC + val->tv_usec * > NSEC_PER_USEC; > > > + u64 ret = (u64)val->tv_sec * NSEC_PER_SEC + > > > + val->tv_usec * NSEC_PER_USEC; > > > return (__force cputime_t) ret; > > > } > > > static inline void cputime_to_timeval(const cputime_t ct, struct timeval > *val) > > > -- > > > 1.9.1 > > > > > >