* [PATCH] time: Cast tv_nsec to u64 for proper shifting in update_vsyscall()
@ 2014-05-09 15:11 Boris Ostrovsky
2014-05-09 15:43 ` H. Peter Anvin
2014-05-09 16:31 ` [tip:x86/urgent] x86, vdso, " tip-bot for Boris Ostrovsky
0 siblings, 2 replies; 6+ messages in thread
From: Boris Ostrovsky @ 2014-05-09 15:11 UTC (permalink / raw)
To: tglx, mingo, hpa
Cc: linux-kernel, stefani, luto, konrad.wilk, boris.ostrovsky, stable
With tk->wall_to_monotonic.tv_nsec being a 32-bit value on 32-bit
systems, (tk->wall_to_monotonic.tv_nsec << tk->shift) in update_vsyscall()
may lose upper bits or, worse, add them since compiler will do this:
(u64)(tk->wall_to_monotonic.tv_nsec << tk->shift)
instead of
((u64)tk->wall_to_monotonic.tv_nsec << tk->shift)
So if, for example, tv_nsec is 0x800000 and shift is 8 we will end up
with 0xffffffff80000000 instead of 0x80000000. And then we are stuck in
the subsequent 'while' loop.
We need explicit cast.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: stable@vger.kernel.org
---
arch/x86/kernel/vsyscall_gtod.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/x86/kernel/vsyscall_gtod.c b/arch/x86/kernel/vsyscall_gtod.c
index f9c6e56..9531fbb 100644
--- a/arch/x86/kernel/vsyscall_gtod.c
+++ b/arch/x86/kernel/vsyscall_gtod.c
@@ -43,7 +43,7 @@ void update_vsyscall(struct timekeeper *tk)
vdata->monotonic_time_sec = tk->xtime_sec
+ tk->wall_to_monotonic.tv_sec;
vdata->monotonic_time_snsec = tk->xtime_nsec
- + (tk->wall_to_monotonic.tv_nsec
+ + ((u64)tk->wall_to_monotonic.tv_nsec
<< tk->shift);
while (vdata->monotonic_time_snsec >=
(((u64)NSEC_PER_SEC) << tk->shift)) {
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] time: Cast tv_nsec to u64 for proper shifting in update_vsyscall()
2014-05-09 15:11 [PATCH] time: Cast tv_nsec to u64 for proper shifting in update_vsyscall() Boris Ostrovsky
@ 2014-05-09 15:43 ` H. Peter Anvin
2014-05-09 15:59 ` Boris Ostrovsky
2014-05-09 16:31 ` [tip:x86/urgent] x86, vdso, " tip-bot for Boris Ostrovsky
1 sibling, 1 reply; 6+ messages in thread
From: H. Peter Anvin @ 2014-05-09 15:43 UTC (permalink / raw)
To: Boris Ostrovsky, tglx, mingo
Cc: linux-kernel, stefani, luto, konrad.wilk, stable
On 05/09/2014 08:11 AM, Boris Ostrovsky wrote:
> With tk->wall_to_monotonic.tv_nsec being a 32-bit value on 32-bit
> systems, (tk->wall_to_monotonic.tv_nsec << tk->shift) in update_vsyscall()
> may lose upper bits or, worse, add them since compiler will do this:
> (u64)(tk->wall_to_monotonic.tv_nsec << tk->shift)
> instead of
> ((u64)tk->wall_to_monotonic.tv_nsec << tk->shift)
>
> So if, for example, tv_nsec is 0x800000 and shift is 8 we will end up
> with 0xffffffff80000000 instead of 0x80000000. And then we are stuck in
> the subsequent 'while' loop.
>
> We need explicit cast.
>
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Cc: stable@vger.kernel.org
This is needed in stable only for v3.14, right?
-hpa
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] time: Cast tv_nsec to u64 for proper shifting in update_vsyscall()
2014-05-09 15:43 ` H. Peter Anvin
@ 2014-05-09 15:59 ` Boris Ostrovsky
2014-05-09 16:03 ` H. Peter Anvin
0 siblings, 1 reply; 6+ messages in thread
From: Boris Ostrovsky @ 2014-05-09 15:59 UTC (permalink / raw)
To: H. Peter Anvin
Cc: tglx, mingo, linux-kernel, stefani, luto, konrad.wilk, stable
On 05/09/2014 11:43 AM, H. Peter Anvin wrote:
> On 05/09/2014 08:11 AM, Boris Ostrovsky wrote:
>> With tk->wall_to_monotonic.tv_nsec being a 32-bit value on 32-bit
>> systems, (tk->wall_to_monotonic.tv_nsec << tk->shift) in update_vsyscall()
>> may lose upper bits or, worse, add them since compiler will do this:
>> (u64)(tk->wall_to_monotonic.tv_nsec << tk->shift)
>> instead of
>> ((u64)tk->wall_to_monotonic.tv_nsec << tk->shift)
>>
>> So if, for example, tv_nsec is 0x800000 and shift is 8 we will end up
>> with 0xffffffff80000000 instead of 0x80000000. And then we are stuck in
>> the subsequent 'while' loop.
>>
>> We need explicit cast.
>>
>> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
>> Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>> Cc: stable@vger.kernel.org
> This is needed in stable only for v3.14, right?
I suspect anything that has commit 650ea024 needs to be fixed. I see
this code, for example, in 3.12 (it used to be in vsyscall_64.c).
-boris
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] time: Cast tv_nsec to u64 for proper shifting in update_vsyscall()
2014-05-09 15:59 ` Boris Ostrovsky
@ 2014-05-09 16:03 ` H. Peter Anvin
2014-05-09 16:23 ` Boris Ostrovsky
0 siblings, 1 reply; 6+ messages in thread
From: H. Peter Anvin @ 2014-05-09 16:03 UTC (permalink / raw)
To: Boris Ostrovsky
Cc: tglx, mingo, linux-kernel, stefani, luto, konrad.wilk, stable
On 05/09/2014 08:59 AM, Boris Ostrovsky wrote:
> On 05/09/2014 11:43 AM, H. Peter Anvin wrote:
>> On 05/09/2014 08:11 AM, Boris Ostrovsky wrote:
>>> With tk->wall_to_monotonic.tv_nsec being a 32-bit value on 32-bit
>>> systems, (tk->wall_to_monotonic.tv_nsec << tk->shift) in
>>> update_vsyscall()
>>> may lose upper bits or, worse, add them since compiler will do this:
>>> (u64)(tk->wall_to_monotonic.tv_nsec << tk->shift)
>>> instead of
>>> ((u64)tk->wall_to_monotonic.tv_nsec << tk->shift)
>>>
>>> So if, for example, tv_nsec is 0x800000 and shift is 8 we will end up
>>> with 0xffffffff80000000 instead of 0x80000000. And then we are stuck in
>>> the subsequent 'while' loop.
>>>
>>> We need explicit cast.
>>>
>>> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
>>> Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>>> Cc: stable@vger.kernel.org
>> This is needed in stable only for v3.14, right?
>
> I suspect anything that has commit 650ea024 needs to be fixed. I see
> this code, for example, in 3.12 (it used to be in vsyscall_64.c).
>
But you're talking about 32-bit platforms. Vsyscalls aren't used on
x86-32 until 3.14. Am I missing something?
-hpa
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] time: Cast tv_nsec to u64 for proper shifting in update_vsyscall()
2014-05-09 16:03 ` H. Peter Anvin
@ 2014-05-09 16:23 ` Boris Ostrovsky
0 siblings, 0 replies; 6+ messages in thread
From: Boris Ostrovsky @ 2014-05-09 16:23 UTC (permalink / raw)
To: H. Peter Anvin
Cc: tglx, mingo, linux-kernel, stefani, luto, konrad.wilk, stable
On 05/09/2014 12:03 PM, H. Peter Anvin wrote:
> On 05/09/2014 08:59 AM, Boris Ostrovsky wrote:
>> On 05/09/2014 11:43 AM, H. Peter Anvin wrote:
>>> On 05/09/2014 08:11 AM, Boris Ostrovsky wrote:
>>>> With tk->wall_to_monotonic.tv_nsec being a 32-bit value on 32-bit
>>>> systems, (tk->wall_to_monotonic.tv_nsec << tk->shift) in
>>>> update_vsyscall()
>>>> may lose upper bits or, worse, add them since compiler will do this:
>>>> (u64)(tk->wall_to_monotonic.tv_nsec << tk->shift)
>>>> instead of
>>>> ((u64)tk->wall_to_monotonic.tv_nsec << tk->shift)
>>>>
>>>> So if, for example, tv_nsec is 0x800000 and shift is 8 we will end up
>>>> with 0xffffffff80000000 instead of 0x80000000. And then we are stuck in
>>>> the subsequent 'while' loop.
>>>>
>>>> We need explicit cast.
>>>>
>>>> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
>>>> Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>>>> Cc: stable@vger.kernel.org
>>> This is needed in stable only for v3.14, right?
>> I suspect anything that has commit 650ea024 needs to be fixed. I see
>> this code, for example, in 3.12 (it used to be in vsyscall_64.c).
>>
> But you're talking about 32-bit platforms. Vsyscalls aren't used on
> x86-32 until 3.14. Am I missing something?
Oh, yes, of course. I was just looking at code without thinking. 3.14
only then.
-boris
^ permalink raw reply [flat|nested] 6+ messages in thread
* [tip:x86/urgent] x86, vdso, time: Cast tv_nsec to u64 for proper shifting in update_vsyscall()
2014-05-09 15:11 [PATCH] time: Cast tv_nsec to u64 for proper shifting in update_vsyscall() Boris Ostrovsky
2014-05-09 15:43 ` H. Peter Anvin
@ 2014-05-09 16:31 ` tip-bot for Boris Ostrovsky
1 sibling, 0 replies; 6+ messages in thread
From: tip-bot for Boris Ostrovsky @ 2014-05-09 16:31 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, konrad.wilk, boris.ostrovsky, tglx
Commit-ID: 28b92e09e25bdc0ae864b22eacf195a74f861389
Gitweb: http://git.kernel.org/tip/28b92e09e25bdc0ae864b22eacf195a74f861389
Author: Boris Ostrovsky <boris.ostrovsky@oracle.com>
AuthorDate: Fri, 9 May 2014 11:11:27 -0400
Committer: H. Peter Anvin <hpa@zytor.com>
CommitDate: Fri, 9 May 2014 08:45:52 -0700
x86, vdso, time: Cast tv_nsec to u64 for proper shifting in update_vsyscall()
With tk->wall_to_monotonic.tv_nsec being a 32-bit value on 32-bit
systems, (tk->wall_to_monotonic.tv_nsec << tk->shift) in update_vsyscall()
may lose upper bits or, worse, add them since compiler will do this:
(u64)(tk->wall_to_monotonic.tv_nsec << tk->shift)
instead of
((u64)tk->wall_to_monotonic.tv_nsec << tk->shift)
So if, for example, tv_nsec is 0x800000 and shift is 8 we will end up
with 0xffffffff80000000 instead of 0x80000000. And then we are stuck in
the subsequent 'while' loop.
We need an explicit cast.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Link: http://lkml.kernel.org/r/1399648287-15178-1-git-send-email-boris.ostrovsky@oracle.com
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: <stable@vger.kernel.org> # v3.14
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
---
arch/x86/kernel/vsyscall_gtod.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/kernel/vsyscall_gtod.c b/arch/x86/kernel/vsyscall_gtod.c
index f9c6e56..9531fbb 100644
--- a/arch/x86/kernel/vsyscall_gtod.c
+++ b/arch/x86/kernel/vsyscall_gtod.c
@@ -43,7 +43,7 @@ void update_vsyscall(struct timekeeper *tk)
vdata->monotonic_time_sec = tk->xtime_sec
+ tk->wall_to_monotonic.tv_sec;
vdata->monotonic_time_snsec = tk->xtime_nsec
- + (tk->wall_to_monotonic.tv_nsec
+ + ((u64)tk->wall_to_monotonic.tv_nsec
<< tk->shift);
while (vdata->monotonic_time_snsec >=
(((u64)NSEC_PER_SEC) << tk->shift)) {
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-05-09 16:31 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-09 15:11 [PATCH] time: Cast tv_nsec to u64 for proper shifting in update_vsyscall() Boris Ostrovsky
2014-05-09 15:43 ` H. Peter Anvin
2014-05-09 15:59 ` Boris Ostrovsky
2014-05-09 16:03 ` H. Peter Anvin
2014-05-09 16:23 ` Boris Ostrovsky
2014-05-09 16:31 ` [tip:x86/urgent] x86, vdso, " tip-bot for Boris Ostrovsky
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.