[PATCH v2] jiffies: Cast to unsigned long for secs_to_jiffies() conversion

Easwar Hariharan posted 1 patch 10 months, 3 weeks ago
include/linux/jiffies.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH v2] jiffies: Cast to unsigned long for secs_to_jiffies() conversion
Posted by Easwar Hariharan 10 months, 3 weeks ago
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
Re: [PATCH v2] jiffies: Cast to unsigned long for secs_to_jiffies() conversion
Posted by Jiri Slaby 10 months, 3 weeks ago
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
Re: [PATCH v2] jiffies: Cast to unsigned long for secs_to_jiffies() conversion
Posted by Thomas Gleixner 10 months, 3 weeks ago
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.
Re: [PATCH v2] jiffies: Cast to unsigned long for secs_to_jiffies() conversion
Posted by Jiri Slaby 10 months, 3 weeks ago
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
Re: [PATCH v2] jiffies: Cast to unsigned long for secs_to_jiffies() conversion
Posted by Easwar Hariharan 10 months, 3 weeks ago
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
[tip: timers/urgent] jiffies: Cast to unsigned long in secs_to_jiffies() conversion
Posted by tip-bot2 for Easwar Hariharan 10 months, 3 weeks ago
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)