2005-01-18 02:19:33

by Roland McGrath

[permalink] [raw]
Subject: [PATCH] cputime.h seems to assume HZ==1000

Shouldn't msecs mean msecs, not secs/HZ?

--- linux-2.6/include/asm-generic/cputime.h
+++ linux-2.6/include/asm-generic/cputime.h
@@ -35,8 +35,8 @@ typedef u64 cputime64_t;
/*
* Convert cputime to seconds and back.
*/
-#define cputime_to_secs(__ct) (jiffies_to_msecs(__ct) / HZ)
-#define secs_to_cputime(__secs) (msecs_to_jiffies(__secs * HZ))
+#define cputime_to_secs(__ct) (jiffies_to_msecs(__ct) / 1000)
+#define secs_to_cputime(__secs) (msecs_to_jiffies(__secs * 1000))

/*
* Convert cputime to timespec and back.


2005-01-18 02:46:28

by Linus Torvalds

[permalink] [raw]
Subject: Re: [PATCH] cputime.h seems to assume HZ==1000



On Mon, 17 Jan 2005, Roland McGrath wrote:
>
> Shouldn't msecs mean msecs, not secs/HZ?

Hmm, sure, but why go through "msecs" at all?

> --- linux-2.6/include/asm-generic/cputime.h
> +++ linux-2.6/include/asm-generic/cputime.h
> @@ -35,8 +35,8 @@ typedef u64 cputime64_t;
> /*
> * Convert cputime to seconds and back.
> */
> -#define cputime_to_secs(__ct) (jiffies_to_msecs(__ct) / HZ)
> -#define secs_to_cputime(__secs) (msecs_to_jiffies(__secs * HZ))
> +#define cputime_to_secs(__ct) (jiffies_to_msecs(__ct) / 1000)
> +#define secs_to_cputime(__secs) (msecs_to_jiffies(__secs * 1000))

iow, why not

#define cputime_to_secs(jif) ((jif) / HZ)
#define secs_to_cputime(sec) ((sec) * HZ)

which avoids double rounding issues etc.

Not to mention that "secs_to_cputime()" lacks the proper parenthesis.

More signers-off-on-this-thing added.

Linus

2005-01-20 00:23:27

by George Anzinger

[permalink] [raw]
Subject: Re: [PATCH] cputime.h seems to assume HZ==1000

Linus Torvalds wrote:
>
> On Mon, 17 Jan 2005, Roland McGrath wrote:
>
>>Shouldn't msecs mean msecs, not secs/HZ?
>
>
> Hmm, sure, but why go through "msecs" at all?
>
>
>>--- linux-2.6/include/asm-generic/cputime.h
>>+++ linux-2.6/include/asm-generic/cputime.h
>>@@ -35,8 +35,8 @@ typedef u64 cputime64_t;
>> /*
>> * Convert cputime to seconds and back.
>> */
>>-#define cputime_to_secs(__ct) (jiffies_to_msecs(__ct) / HZ)
>>-#define secs_to_cputime(__secs) (msecs_to_jiffies(__secs * HZ))
>>+#define cputime_to_secs(__ct) (jiffies_to_msecs(__ct) / 1000)
>>+#define secs_to_cputime(__secs) (msecs_to_jiffies(__secs * 1000))
>
>
> iow, why not
>
> #define cputime_to_secs(jif) ((jif) / HZ)
> #define secs_to_cputime(sec) ((sec) * HZ)
>
> which avoids double rounding issues etc.

If we care, the jiffies_to_msecs() code is in include/linux/jiffies.h just prior
to other conversion code that does NOT make the assumtion that HZ is exact. To
be exact:

static inline long cputime_to_secs(unsigned long jif)
{
int t;
u64 result = (u64)jif * TICK_NSEC;
t = do_div(result ,NSEC_PER_SEC);
return (u32)result + t ? 1:0; /* round up if not exact */
}
#define secs_to_cputime(sec) (((U64) sec * SEC_CONVERSION) >> SEC_JIFFIE_SC)

This last assumes sec worth of jiffies will actually fit in a long...

--
George Anzinger [email protected]
High-res-timers: http://sourceforge.net/projects/high-res-timers/