From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
To: neelx@suse.com
Cc: Frank.Li@nxp.com, James.Bottomley@hansenpartnership.com,
Julia.Lawall@inria.fr, Shyam-sundar.S-k@amd.com,
akpm@linux-foundation.org, axboe@kernel.dk, broonie@kernel.org,
cassel@kernel.org, cem@kernel.org, ceph-devel@vger.kernel.org,
christophe.jaillet@wanadoo.fr, clm@fb.com, cocci@inria.fr,
dick.kennedy@broadcom.com, djwong@kernel.org, dlemoal@kernel.org,
dongsheng.yang@easystack.cn, dri-devel@lists.freedesktop.org,
dsterba@suse.com, eahariha@linux.microsoft.com,
festevam@gmail.com, hch@lst.de, hdegoede@redhat.com,
hmh@hmh.eng.br, ibm-acpi-devel@lists.sourceforge.net,
idryomov@gmail.com, ilpo.jarvinen@linux.intel.com,
imx@lists.linux.dev, james.smart@broadcom.com, jgg@ziepe.ca,
josef@toxicpanda.com, kalesh-anakkur.purayil@broadcom.com,
kbusch@kernel.org, kernel@pengutronix.de, leon@kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-block@vger.kernel.org, linux-btrfs@vger.kernel.org,
linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-nvme@lists.infradead.org, linux-pm@vger.kernel.org,
linux-rdma@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-sound@vger.kernel.org, linux-spi@vger.kernel.org,
linux-xfs@vger.kernel.org, martin.petersen@oracle.com,
nicolas.palix@imag.fr, ogabbay@kernel.org, perex@perex.cz,
platform-driver-x86@vger.kernel.org, s.hauer@pengutronix.de,
sagi@grimberg.me, selvin.xavier@broadcom.com,
shawnguo@kernel.org, sre@kernel.org, tiwai@suse.com,
xiubli@redhat.com, yaron.avizrat@intel.com
Subject: Re: [PATCH v3 06/16] rbd: convert timeouts to secs_to_jiffies()
Date: Wed, 26 Feb 2025 09:10:07 +0100 [thread overview]
Message-ID: <7b8346a1-8a7d-4fcf-a026-119d77f2ca85@wanadoo.fr> (raw)
In-Reply-To: <CAPjX3Fcr+BoMRgZGbqqgpF+w-sHU+SqGT8QJ3QCp8uvJbnaFsQ@mail.gmail.com>
Le 26/02/2025 à 08:28, Daniel Vacek a écrit :
> On Tue, 25 Feb 2025 at 22:10, Christophe JAILLET
> <christophe.jaillet-39ZsbGIQGT5GWvitb5QawA@public.gmane.org> wrote:
>>
>> Le 25/02/2025 à 21:17, Easwar Hariharan a écrit :
>>> Commit b35108a51cf7 ("jiffies: Define secs_to_jiffies()") introduced
>>> secs_to_jiffies(). As the value here is a multiple of 1000, use
>>> secs_to_jiffies() instead of msecs_to_jiffies() to avoid the multiplication
>>>
>>> This is converted using scripts/coccinelle/misc/secs_to_jiffies.cocci with
>>> the following Coccinelle rules:
>>>
>>> @depends on patch@ expression E; @@
>>>
>>> -msecs_to_jiffies(E * 1000)
>>> +secs_to_jiffies(E)
>>>
>>> @depends on patch@ expression E; @@
>>>
>>> -msecs_to_jiffies(E * MSEC_PER_SEC)
>>> +secs_to_jiffies(E)
>>>
>>> While here, remove the no-longer necessary check for range since there's
>>> no multiplication involved.
>>
>> I'm not sure this is correct.
>> Now you multiply by HZ and things can still overflow.
>
> This does not deal with any additional multiplications. If there is an
> overflow, it was already there before to begin with, IMO.
>
>> Hoping I got casting right:
>
> Maybe not exactly? See below...
>
>> #define MSEC_PER_SEC 1000L
>> #define HZ 100
>>
>>
>> #define secs_to_jiffies(_secs) (unsigned long)((_secs) * HZ)
>>
>> static inline unsigned long _msecs_to_jiffies(const unsigned int m)
>> {
>> return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
>> }
>>
>> int main() {
>>
>> int n = INT_MAX - 5;
>>
>> printf("res = %ld\n", secs_to_jiffies(n));
>> printf("res = %ld\n", _msecs_to_jiffies(1000 * n));
>
> I think the format should actually be %lu giving the below results:
>
> res = 18446744073709551016
> res = 429496130
>
> Which is still wrong nonetheless. But here, *both* results are wrong
> as the expected output should be 214748364200 which you'll get with
> the correct helper/macro.
>
> But note another thing, the 1000 * (INT_MAX - 5) already overflows
> even before calling _msecs_to_jiffies(). See?
Agreed and intentional in my test C code.
That is the point.
The "if (result.uint_32 > INT_MAX / 1000)" in the original code was
handling such values.
>
> Now, you'll get that mentioned correct result with:
>
> #define secs_to_jiffies(_secs) ((unsigned long)(_secs) * HZ)
Not looked in details, but I think I would second on you on this, in
this specific example. Not sure if it would handle all possible uses of
secs_to_jiffies().
But it is not how secs_to_jiffies() is defined up to now. See [1].
[1]:
https://elixir.bootlin.com/linux/v6.14-rc4/source/include/linux/jiffies.h#L540
>
> Still, why unsigned? What if you wanted to convert -5 seconds to jiffies?
See commit bb2784d9ab495 which added the cast.
>
>> return 0;
>> }
>>
>>
>> gives :
>>
>> res = -600
>> res = 429496130
>>
>> with msec, the previous code would catch the overflow, now it overflows
>> silently.
>
> What compiler options are you using? I'm not getting any warnings.
I mean, with:
if (result.uint_32 > INT_MAX / 1000)
goto out_of_range;
the overflow would be handled *at runtime*.
Without such a check, an unexpected value could be stored in
opt->lock_timeout.
I think that a test is needed and with secs_to_jiffies(), I tentatively
proposed:
if (result.uint_32 > INT_MAX / HZ)
goto out_of_range;
CJ
>
>> untested, but maybe:
>> if (result.uint_32 > INT_MAX / HZ)
>> goto out_of_range;
>>
>> ?
>>
>> CJ
>>
...
WARNING: multiple messages have this Message-ID (diff)
From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
To: neelx@suse.com
Cc: Frank.Li@nxp.com, James.Bottomley@hansenpartnership.com,
Julia.Lawall@inria.fr, Shyam-sundar.S-k@amd.com,
akpm@linux-foundation.org, axboe@kernel.dk, broonie@kernel.org,
cassel@kernel.org, cem@kernel.org, ceph-devel@vger.kernel.org,
christophe.jaillet@wanadoo.fr, clm@fb.com, cocci@inria.fr,
dick.kennedy@broadcom.com, djwong@kernel.org, dlemoal@kernel.org,
dongsheng.yang@easystack.cn, dri-devel@lists.freedesktop.org,
dsterba@suse.com, eahariha@linux.microsoft.com,
festevam@gmail.com, hch@lst.de, hdegoede@redhat.com,
hmh@hmh.eng.br, ibm-acpi-devel@lists.sourceforge.net,
idryomov@gmail.com, ilpo.jarvinen@linux.intel.com,
imx@lists.linux.dev, james.smart@broadcom.com, jgg@ziepe.ca,
josef@toxicpanda.com, kalesh-anakkur.purayil@broadcom.com,
kbusch@kernel.org, kernel@pengutronix.de, leon@kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-block@vger.kernel.org, linux-btrfs@vger.kernel.org,
linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-nvme@lists.infradead.org, linux-pm@vger.kernel.org,
linux-rdma@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-sound@vger.kernel.org, linux-spi@vger.kernel.org,
linux-xfs@vger.kernel.org, martin.petersen@oracle.com,
nicolas.palix@imag.fr, ogabbay@kernel.org, perex@perex.cz,
platform-driver-x86@vger.kernel.org, s.hauer@pengutronix.de,
sagi@grimberg.me, selvin.xavier@broadcom.com,
shawnguo@kernel.org, sre@kernel.org, tiwai@suse.com,
xiubli@redhat.com, yaron.avizrat@intel.com
Subject: Re: [cocci] [PATCH v3 06/16] rbd: convert timeouts to secs_to_jiffies()
Date: Wed, 26 Feb 2025 09:10:07 +0100 [thread overview]
Message-ID: <7b8346a1-8a7d-4fcf-a026-119d77f2ca85@wanadoo.fr> (raw)
In-Reply-To: <CAPjX3Fcr+BoMRgZGbqqgpF+w-sHU+SqGT8QJ3QCp8uvJbnaFsQ@mail.gmail.com>
Le 26/02/2025 à 08:28, Daniel Vacek a écrit :
> On Tue, 25 Feb 2025 at 22:10, Christophe JAILLET
> <christophe.jaillet-39ZsbGIQGT5GWvitb5QawA@public.gmane.org> wrote:
>>
>> Le 25/02/2025 à 21:17, Easwar Hariharan a écrit :
>>> Commit b35108a51cf7 ("jiffies: Define secs_to_jiffies()") introduced
>>> secs_to_jiffies(). As the value here is a multiple of 1000, use
>>> secs_to_jiffies() instead of msecs_to_jiffies() to avoid the multiplication
>>>
>>> This is converted using scripts/coccinelle/misc/secs_to_jiffies.cocci with
>>> the following Coccinelle rules:
>>>
>>> @depends on patch@ expression E; @@
>>>
>>> -msecs_to_jiffies(E * 1000)
>>> +secs_to_jiffies(E)
>>>
>>> @depends on patch@ expression E; @@
>>>
>>> -msecs_to_jiffies(E * MSEC_PER_SEC)
>>> +secs_to_jiffies(E)
>>>
>>> While here, remove the no-longer necessary check for range since there's
>>> no multiplication involved.
>>
>> I'm not sure this is correct.
>> Now you multiply by HZ and things can still overflow.
>
> This does not deal with any additional multiplications. If there is an
> overflow, it was already there before to begin with, IMO.
>
>> Hoping I got casting right:
>
> Maybe not exactly? See below...
>
>> #define MSEC_PER_SEC 1000L
>> #define HZ 100
>>
>>
>> #define secs_to_jiffies(_secs) (unsigned long)((_secs) * HZ)
>>
>> static inline unsigned long _msecs_to_jiffies(const unsigned int m)
>> {
>> return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
>> }
>>
>> int main() {
>>
>> int n = INT_MAX - 5;
>>
>> printf("res = %ld\n", secs_to_jiffies(n));
>> printf("res = %ld\n", _msecs_to_jiffies(1000 * n));
>
> I think the format should actually be %lu giving the below results:
>
> res = 18446744073709551016
> res = 429496130
>
> Which is still wrong nonetheless. But here, *both* results are wrong
> as the expected output should be 214748364200 which you'll get with
> the correct helper/macro.
>
> But note another thing, the 1000 * (INT_MAX - 5) already overflows
> even before calling _msecs_to_jiffies(). See?
Agreed and intentional in my test C code.
That is the point.
The "if (result.uint_32 > INT_MAX / 1000)" in the original code was
handling such values.
>
> Now, you'll get that mentioned correct result with:
>
> #define secs_to_jiffies(_secs) ((unsigned long)(_secs) * HZ)
Not looked in details, but I think I would second on you on this, in
this specific example. Not sure if it would handle all possible uses of
secs_to_jiffies().
But it is not how secs_to_jiffies() is defined up to now. See [1].
[1]:
https://elixir.bootlin.com/linux/v6.14-rc4/source/include/linux/jiffies.h#L540
>
> Still, why unsigned? What if you wanted to convert -5 seconds to jiffies?
See commit bb2784d9ab495 which added the cast.
>
>> return 0;
>> }
>>
>>
>> gives :
>>
>> res = -600
>> res = 429496130
>>
>> with msec, the previous code would catch the overflow, now it overflows
>> silently.
>
> What compiler options are you using? I'm not getting any warnings.
I mean, with:
if (result.uint_32 > INT_MAX / 1000)
goto out_of_range;
the overflow would be handled *at runtime*.
Without such a check, an unexpected value could be stored in
opt->lock_timeout.
I think that a test is needed and with secs_to_jiffies(), I tentatively
proposed:
if (result.uint_32 > INT_MAX / HZ)
goto out_of_range;
CJ
>
>> untested, but maybe:
>> if (result.uint_32 > INT_MAX / HZ)
>> goto out_of_range;
>>
>> ?
>>
>> CJ
>>
...
next prev parent reply other threads:[~2025-02-26 8:11 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-25 20:17 [PATCH v3 00/16] Converge on using secs_to_jiffies() part two Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 20:17 ` [PATCH v3 01/16] coccinelle: misc: secs_to_jiffies: Patch expressions too Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-26 8:26 ` Markus Elfring
2025-02-25 20:17 ` [PATCH v3 02/16] scsi: lpfc: convert timeouts to secs_to_jiffies() Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-03-04 2:11 ` Martin K. Petersen
2025-03-04 2:11 ` [cocci] " Martin K. Petersen
2025-02-25 20:17 ` [PATCH v3 03/16] accel/habanalabs: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 20:17 ` [PATCH v3 04/16] ALSA: ac97: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-26 11:55 ` Markus Elfring
2025-02-25 20:17 ` [PATCH v3 05/16] btrfs: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 20:17 ` [PATCH v3 06/16] rbd: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 21:09 ` Christophe JAILLET
2025-02-25 21:09 ` [cocci] " Christophe JAILLET
2025-02-26 0:02 ` Easwar Hariharan
2025-02-26 0:02 ` [cocci] " Easwar Hariharan
2025-02-26 7:28 ` Daniel Vacek
2025-02-26 7:28 ` [cocci] " Daniel Vacek
2025-02-26 8:10 ` Christophe JAILLET [this message]
2025-02-26 8:10 ` Christophe JAILLET
2025-02-26 8:29 ` Daniel Vacek
2025-02-26 8:29 ` [cocci] " Daniel Vacek
2025-02-25 20:17 ` [PATCH v3 07/16] libceph: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 21:25 ` Christophe JAILLET
2025-02-25 21:25 ` [cocci] " Christophe JAILLET
2025-02-25 20:17 ` [PATCH v3 08/16] ata: libata-zpodd: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 20:24 ` Easwar Hariharan
2025-02-25 20:24 ` [cocci] " Easwar Hariharan
2025-02-26 2:00 ` Damien Le Moal
2025-02-26 2:00 ` [cocci] " Damien Le Moal
2025-02-25 20:17 ` [PATCH v3 09/16] xfs: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-26 1:03 ` Christoph Hellwig
2025-02-25 20:17 ` [PATCH v3 10/16] power: supply: da9030: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 20:17 ` [PATCH v3 11/16] nvme: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-26 1:04 ` Christoph Hellwig
2025-02-25 20:17 ` [PATCH v3 12/16] spi: spi-fsl-lpspi: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 20:17 ` [PATCH v3 13/16] spi: spi-imx: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 20:27 ` Marc Kleine-Budde
2025-02-25 20:27 ` [cocci] " Marc Kleine-Budde
2025-02-25 20:17 ` [PATCH v3 14/16] platform/x86/amd/pmf: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-03-21 16:08 ` Ilpo Järvinen
2025-03-21 16:08 ` [cocci] " Ilpo Järvinen
2025-02-25 20:17 ` [PATCH v3 15/16] platform/x86: thinkpad_acpi: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-03-21 16:06 ` Ilpo Järvinen
2025-03-21 16:06 ` [cocci] " Ilpo Järvinen
2025-02-25 20:17 ` [PATCH v3 16/16] RDMA/bnxt_re: " Easwar Hariharan
2025-02-25 20:17 ` [cocci] " Easwar Hariharan
2025-02-25 20:30 ` (subset) [PATCH v3 00/16] Converge on using secs_to_jiffies() part two Jens Axboe
2025-02-25 20:30 ` [cocci] " Jens Axboe
2025-02-26 1:11 ` Christoph Hellwig
2025-02-26 11:29 ` Mark Brown
2025-02-26 11:29 ` [cocci] " Mark Brown
2025-02-26 20:38 ` Andrew Morton
2025-02-26 20:38 ` [cocci] " Andrew Morton
2025-02-26 22:26 ` Mark Brown
2025-02-26 22:26 ` [cocci] " Mark Brown
2025-02-27 9:02 ` Carlos Maiolino
2025-02-27 9:02 ` [cocci] " Carlos Maiolino
2025-02-26 16:48 ` (subset) " Mark Brown
2025-02-26 16:48 ` [cocci] " Mark Brown
2025-03-11 1:19 ` Martin K. Petersen
2025-03-11 1:19 ` [cocci] " Martin K. Petersen
2025-03-11 2:08 ` Andrew Morton
2025-03-11 2:08 ` [cocci] " Andrew Morton
2025-03-11 2:29 ` Martin K. Petersen
2025-03-11 2:29 ` [cocci] " Martin K. Petersen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7b8346a1-8a7d-4fcf-a026-119d77f2ca85@wanadoo.fr \
--to=christophe.jaillet@wanadoo.fr \
--cc=Frank.Li@nxp.com \
--cc=James.Bottomley@hansenpartnership.com \
--cc=Julia.Lawall@inria.fr \
--cc=Shyam-sundar.S-k@amd.com \
--cc=akpm@linux-foundation.org \
--cc=axboe@kernel.dk \
--cc=broonie@kernel.org \
--cc=cassel@kernel.org \
--cc=cem@kernel.org \
--cc=ceph-devel@vger.kernel.org \
--cc=clm@fb.com \
--cc=cocci@inria.fr \
--cc=dick.kennedy@broadcom.com \
--cc=djwong@kernel.org \
--cc=dlemoal@kernel.org \
--cc=dongsheng.yang@easystack.cn \
--cc=dri-devel@lists.freedesktop.org \
--cc=dsterba@suse.com \
--cc=eahariha@linux.microsoft.com \
--cc=festevam@gmail.com \
--cc=hch@lst.de \
--cc=hdegoede@redhat.com \
--cc=hmh@hmh.eng.br \
--cc=ibm-acpi-devel@lists.sourceforge.net \
--cc=idryomov@gmail.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=imx@lists.linux.dev \
--cc=james.smart@broadcom.com \
--cc=jgg@ziepe.ca \
--cc=josef@toxicpanda.com \
--cc=kalesh-anakkur.purayil@broadcom.com \
--cc=kbusch@kernel.org \
--cc=kernel@pengutronix.de \
--cc=leon@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=linux-spi@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=neelx@suse.com \
--cc=nicolas.palix@imag.fr \
--cc=ogabbay@kernel.org \
--cc=perex@perex.cz \
--cc=platform-driver-x86@vger.kernel.org \
--cc=s.hauer@pengutronix.de \
--cc=sagi@grimberg.me \
--cc=selvin.xavier@broadcom.com \
--cc=shawnguo@kernel.org \
--cc=sre@kernel.org \
--cc=tiwai@suse.com \
--cc=xiubli@redhat.com \
--cc=yaron.avizrat@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.