include/linux/jiffies.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
While converting users of msecs_to_jiffies(), lkp reported that some
range checks would always be true because of the mismatch between the
implied int value of secs_to_jiffies() vs the unsigned long
return value of the msecs_to_jiffies() calls it was replacing. Fix this
by casting secs_to_jiffies() values as unsigned long.
Fixes: b35108a51cf7ba ("jiffies: Define secs_to_jiffies()")
CC: stable@vger.kernel.org # 6.13+
CC: Andrew Morton <akpm@linux-foundation.org>
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202501301334.NB6NszQR-lkp@intel.com/
Signed-off-by: Easwar Hariharan <eahariha@linux.microsoft.com>
---
include/linux/jiffies.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
index ed945f42e064..0ea8c9887429 100644
--- a/include/linux/jiffies.h
+++ b/include/linux/jiffies.h
@@ -537,7 +537,7 @@ static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
*
* Return: jiffies value
*/
-#define secs_to_jiffies(_secs) ((_secs) * HZ)
+#define secs_to_jiffies(_secs) (unsigned long)((_secs) * HZ)
extern unsigned long __usecs_to_jiffies(const unsigned int u);
#if !(USEC_PER_SEC % HZ)
--
2.43.0
On 30. 01. 25, 20:26, Easwar Hariharan wrote:
> While converting users of msecs_to_jiffies(), lkp reported that some
> range checks would always be true because of the mismatch between the
> implied int value of secs_to_jiffies() vs the unsigned long
> return value of the msecs_to_jiffies() calls it was replacing. Fix this
> by casting secs_to_jiffies() values as unsigned long.
>
> Fixes: b35108a51cf7ba ("jiffies: Define secs_to_jiffies()")
> CC: stable@vger.kernel.org # 6.13+
> CC: Andrew Morton <akpm@linux-foundation.org>
> Reported-by: kernel test robot <lkp@intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202501301334.NB6NszQR-lkp@intel.com/
> Signed-off-by: Easwar Hariharan <eahariha@linux.microsoft.com>
> ---
> include/linux/jiffies.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
> index ed945f42e064..0ea8c9887429 100644
> --- a/include/linux/jiffies.h
> +++ b/include/linux/jiffies.h
> @@ -537,7 +537,7 @@ static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
> *
> * Return: jiffies value
> */
> -#define secs_to_jiffies(_secs) ((_secs) * HZ)
> +#define secs_to_jiffies(_secs) (unsigned long)((_secs) * HZ)
Could you just switch the fun to an inline instead?
--
js
suse labs
On Fri, Jan 31 2025 at 08:06, Jiri Slaby wrote:
> On 30. 01. 25, 20:26, Easwar Hariharan wrote:
>> While converting users of msecs_to_jiffies(), lkp reported that some
>> range checks would always be true because of the mismatch between the
>> implied int value of secs_to_jiffies() vs the unsigned long
>> return value of the msecs_to_jiffies() calls it was replacing. Fix this
>> by casting secs_to_jiffies() values as unsigned long.
>>
>> Fixes: b35108a51cf7ba ("jiffies: Define secs_to_jiffies()")
>> CC: stable@vger.kernel.org # 6.13+
>> CC: Andrew Morton <akpm@linux-foundation.org>
>> Reported-by: kernel test robot <lkp@intel.com>
>> Closes: https://lore.kernel.org/oe-kbuild-all/202501301334.NB6NszQR-lkp@intel.com/
>> Signed-off-by: Easwar Hariharan <eahariha@linux.microsoft.com>
>> ---
>> include/linux/jiffies.h | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
>> index ed945f42e064..0ea8c9887429 100644
>> --- a/include/linux/jiffies.h
>> +++ b/include/linux/jiffies.h
>> @@ -537,7 +537,7 @@ static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
>> *
>> * Return: jiffies value
>> */
>> -#define secs_to_jiffies(_secs) ((_secs) * HZ)
>> +#define secs_to_jiffies(_secs) (unsigned long)((_secs) * HZ)
>
> Could you just switch the fun to an inline instead?
It's a macro so it can be used in static initializers.
On 31. 01. 25, 9:30, Thomas Gleixner wrote:
> On Fri, Jan 31 2025 at 08:06, Jiri Slaby wrote:
>> On 30. 01. 25, 20:26, Easwar Hariharan wrote:
>>> While converting users of msecs_to_jiffies(), lkp reported that some
>>> range checks would always be true because of the mismatch between the
>>> implied int value of secs_to_jiffies() vs the unsigned long
>>> return value of the msecs_to_jiffies() calls it was replacing. Fix this
>>> by casting secs_to_jiffies() values as unsigned long.
>>>
>>> Fixes: b35108a51cf7ba ("jiffies: Define secs_to_jiffies()")
>>> CC: stable@vger.kernel.org # 6.13+
>>> CC: Andrew Morton <akpm@linux-foundation.org>
>>> Reported-by: kernel test robot <lkp@intel.com>
>>> Closes: https://lore.kernel.org/oe-kbuild-all/202501301334.NB6NszQR-lkp@intel.com/
>>> Signed-off-by: Easwar Hariharan <eahariha@linux.microsoft.com>
>>> ---
>>> include/linux/jiffies.h | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
>>> index ed945f42e064..0ea8c9887429 100644
>>> --- a/include/linux/jiffies.h
>>> +++ b/include/linux/jiffies.h
>>> @@ -537,7 +537,7 @@ static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
>>> *
>>> * Return: jiffies value
>>> */
>>> -#define secs_to_jiffies(_secs) ((_secs) * HZ)
>>> +#define secs_to_jiffies(_secs) (unsigned long)((_secs) * HZ)
>>
>> Could you just switch the fun to an inline instead?
>
> It's a macro so it can be used in static initializers.
It's the only one from the *_to_jiffies() family we offer. And I fail to
find such a use (by a quick grep, it only might be hidden)? People
apparently use "* HZ" in initializers...
So sure, iff there is this intention for this very one, keep it as macro.
--
js
suse labs
On 1/31/2025 12:52 AM, Jiri Slaby wrote:
> On 31. 01. 25, 9:30, Thomas Gleixner wrote:
>> On Fri, Jan 31 2025 at 08:06, Jiri Slaby wrote:
>>> On 30. 01. 25, 20:26, Easwar Hariharan wrote:
>>>> While converting users of msecs_to_jiffies(), lkp reported that some
>>>> range checks would always be true because of the mismatch between the
>>>> implied int value of secs_to_jiffies() vs the unsigned long
>>>> return value of the msecs_to_jiffies() calls it was replacing. Fix this
>>>> by casting secs_to_jiffies() values as unsigned long.
>>>>
>>>> Fixes: b35108a51cf7ba ("jiffies: Define secs_to_jiffies()")
>>>> CC: stable@vger.kernel.org # 6.13+
>>>> CC: Andrew Morton <akpm@linux-foundation.org>
>>>> Reported-by: kernel test robot <lkp@intel.com>
>>>> Closes: https://lore.kernel.org/oe-kbuild-all/202501301334.NB6NszQR-
>>>> lkp@intel.com/
>>>> Signed-off-by: Easwar Hariharan <eahariha@linux.microsoft.com>
>>>> ---
>>>> include/linux/jiffies.h | 2 +-
>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
>>>> index ed945f42e064..0ea8c9887429 100644
>>>> --- a/include/linux/jiffies.h
>>>> +++ b/include/linux/jiffies.h
>>>> @@ -537,7 +537,7 @@ static __always_inline unsigned long
>>>> msecs_to_jiffies(const unsigned int m)
>>>> *
>>>> * Return: jiffies value
>>>> */
>>>> -#define secs_to_jiffies(_secs) ((_secs) * HZ)
>>>> +#define secs_to_jiffies(_secs) (unsigned long)((_secs) * HZ)
>>>
>>> Could you just switch the fun to an inline instead?
>>
>> It's a macro so it can be used in static initializers.
>
> It's the only one from the *_to_jiffies() family we offer. And I fail to
> find such a use (by a quick grep, it only might be hidden)? People
> apparently use "* HZ" in initializers...
>
> So sure, iff there is this intention for this very one, keep it as macro.
>
Yes, the intent is to convert those usages of "* HZ" to use
secs_to_jiffies() for better readability.
Thanks,
Easwar
The following commit has been merged into the timers/urgent branch of tip:
Commit-ID: bb2784d9ab49587ba4fbff37a319fff2924db289
Gitweb: https://git.kernel.org/tip/bb2784d9ab49587ba4fbff37a319fff2924db289
Author: Easwar Hariharan <eahariha@linux.microsoft.com>
AuthorDate: Thu, 30 Jan 2025 19:26:58
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Fri, 31 Jan 2025 09:30:49 +01:00
jiffies: Cast to unsigned long in secs_to_jiffies() conversion
While converting users of msecs_to_jiffies(), lkp reported that some range
checks would always be true because of the mismatch between the implied int
value of secs_to_jiffies() vs the unsigned long return value of the
msecs_to_jiffies() calls it was replacing.
Fix this by casting the secs_to_jiffies() input value to unsigned long.
Fixes: b35108a51cf7ba ("jiffies: Define secs_to_jiffies()")
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Easwar Hariharan <eahariha@linux.microsoft.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/all/20250130192701.99626-1-eahariha@linux.microsoft.com
Closes: https://lore.kernel.org/oe-kbuild-all/202501301334.NB6NszQR-lkp@intel.com/
---
include/linux/jiffies.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
index ed945f4..0ea8c98 100644
--- a/include/linux/jiffies.h
+++ b/include/linux/jiffies.h
@@ -537,7 +537,7 @@ static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
*
* Return: jiffies value
*/
-#define secs_to_jiffies(_secs) ((_secs) * HZ)
+#define secs_to_jiffies(_secs) (unsigned long)((_secs) * HZ)
extern unsigned long __usecs_to_jiffies(const unsigned int u);
#if !(USEC_PER_SEC % HZ)
© 2016 - 2025 Red Hat, Inc.