diff mbox

arm64: vdso: minor ABI fix for clock_getres

Message ID 1424820067-13112-1-git-send-email-nathan_lynch@mentor.com (mailing list archive)
State New, archived
Headers show

Commit Message

Nathan Lynch Feb. 24, 2015, 11:21 p.m. UTC
The vdso implementation of clock_getres currently returns 0 (success)
whenever a null timespec is provided by the caller, regardless of the
clock id supplied.

This behavior is incorrect.  It should fall back to syscall when an
unrecognized clock id is passed, even when the timespec argument is
null.  This ensures that clock_getres always returns an error for
invalid clock ids.

Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
---
 arch/arm64/kernel/vdso/gettimeofday.S | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

Will Deacon Feb. 25, 2015, 4:02 p.m. UTC | #1
On Tue, Feb 24, 2015 at 11:21:07PM +0000, Nathan Lynch wrote:
> The vdso implementation of clock_getres currently returns 0 (success)
> whenever a null timespec is provided by the caller, regardless of the
> clock id supplied.
> 
> This behavior is incorrect.  It should fall back to syscall when an
> unrecognized clock id is passed, even when the timespec argument is
> null.  This ensures that clock_getres always returns an error for
> invalid clock ids.
> 
> Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
> ---
>  arch/arm64/kernel/vdso/gettimeofday.S | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)

Acked-by: Will Deacon <will.deacon@arm.com>

Thanks, Nathan.

Will

> diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S
> index fe652ffd34c2..efa79e8d4196 100644
> --- a/arch/arm64/kernel/vdso/gettimeofday.S
> +++ b/arch/arm64/kernel/vdso/gettimeofday.S
> @@ -174,8 +174,6 @@ ENDPROC(__kernel_clock_gettime)
>  /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */
>  ENTRY(__kernel_clock_getres)
>  	.cfi_startproc
> -	cbz	w1, 3f
> -
>  	cmp	w0, #CLOCK_REALTIME
>  	ccmp	w0, #CLOCK_MONOTONIC, #0x4, ne
>  	b.ne	1f
> @@ -188,6 +186,7 @@ ENTRY(__kernel_clock_getres)
>  	b.ne	4f
>  	ldr	x2, 6f
>  2:
> +	cbz	w1, 3f
>  	stp	xzr, x2, [x1]
>  
>  3:	/* res == NULL. */
> -- 
> 1.9.3
> 
>
Nathan Lynch Feb. 25, 2015, 4:14 p.m. UTC | #2
On 02/25/2015 10:02 AM, Will Deacon wrote:
> On Tue, Feb 24, 2015 at 11:21:07PM +0000, Nathan Lynch wrote:
>> The vdso implementation of clock_getres currently returns 0 (success)
>> whenever a null timespec is provided by the caller, regardless of the
>> clock id supplied.
>>
>> This behavior is incorrect.  It should fall back to syscall when an
>> unrecognized clock id is passed, even when the timespec argument is
>> null.  This ensures that clock_getres always returns an error for
>> invalid clock ids.
>>
>> Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
>> ---
>>  arch/arm64/kernel/vdso/gettimeofday.S | 3 +--
>>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> Acked-by: Will Deacon <will.deacon@arm.com>
> 
> Thanks, Nathan.

Thank you.  I'm curious -- do you know of a use case for the VDSO
implementation of clock_getres?  I.e. what kind of real-world workload
sees a benefit from it?

I'm not suggesting removing it from the arm64 vdso, but I'm considering
dropping clock_getres from the 32-bit ARM vdso patch set since I haven't
been able to answer this.
Will Deacon Feb. 25, 2015, 4:32 p.m. UTC | #3
On Wed, Feb 25, 2015 at 04:14:19PM +0000, Nathan Lynch wrote:
> On 02/25/2015 10:02 AM, Will Deacon wrote:
> > On Tue, Feb 24, 2015 at 11:21:07PM +0000, Nathan Lynch wrote:
> >> The vdso implementation of clock_getres currently returns 0 (success)
> >> whenever a null timespec is provided by the caller, regardless of the
> >> clock id supplied.
> >>
> >> This behavior is incorrect.  It should fall back to syscall when an
> >> unrecognized clock id is passed, even when the timespec argument is
> >> null.  This ensures that clock_getres always returns an error for
> >> invalid clock ids.
> >>
> >> Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
> >> ---
> >>  arch/arm64/kernel/vdso/gettimeofday.S | 3 +--
> >>  1 file changed, 1 insertion(+), 2 deletions(-)
> > 
> > Acked-by: Will Deacon <will.deacon@arm.com>
> > 
> > Thanks, Nathan.
> 
> Thank you.  I'm curious -- do you know of a use case for the VDSO
> implementation of clock_getres?  I.e. what kind of real-world workload
> sees a benefit from it?

No, I just implemented it for completeness (and it's also way simpler than
the other functions!). Calling it with a NULL timespec is probably even
less common, so an alternative to your patch would be changing the label
of the existing cbz to hand-off to the kernel when the thing is NULL.

> I'm not suggesting removing it from the arm64 vdso, but I'm considering
> dropping clock_getres from the 32-bit ARM vdso patch set since I haven't
> been able to answer this.

Well, if there aren't any fastpath users then I'm not bothered about
removing it from arm64 either. I'm not sure how we establish that, though.

Will
Nathan Lynch Feb. 25, 2015, 6:33 p.m. UTC | #4
On 02/25/2015 10:32 AM, Will Deacon wrote:
> On Wed, Feb 25, 2015 at 04:14:19PM +0000, Nathan Lynch wrote:
>> On 02/25/2015 10:02 AM, Will Deacon wrote:
>>> On Tue, Feb 24, 2015 at 11:21:07PM +0000, Nathan Lynch wrote:
>>>> The vdso implementation of clock_getres currently returns 0 (success)
>>>> whenever a null timespec is provided by the caller, regardless of the
>>>> clock id supplied.
>>>>
>>>> This behavior is incorrect.  It should fall back to syscall when an
>>>> unrecognized clock id is passed, even when the timespec argument is
>>>> null.  This ensures that clock_getres always returns an error for
>>>> invalid clock ids.
>>>>
>>>> Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
>>>> ---
>>>>  arch/arm64/kernel/vdso/gettimeofday.S | 3 +--
>>>>  1 file changed, 1 insertion(+), 2 deletions(-)
>>>
>>> Acked-by: Will Deacon <will.deacon@arm.com>
>>>
>>> Thanks, Nathan.
>>
>> Thank you.  I'm curious -- do you know of a use case for the VDSO
>> implementation of clock_getres?  I.e. what kind of real-world workload
>> sees a benefit from it?
> 
> No, I just implemented it for completeness (and it's also way simpler than
> the other functions!).

Yeah it was the first function I implemented for the arm32 vdso :-)


> Calling it with a NULL timespec is probably even
> less common, so an alternative to your patch would be changing the label
> of the existing cbz to hand-off to the kernel when the thing is NULL.

Yes, but I'll leave it alone unless you'd prefer that to this patch.


>> I'm not suggesting removing it from the arm64 vdso, but I'm considering
>> dropping clock_getres from the 32-bit ARM vdso patch set since I haven't
>> been able to answer this.
> 
> Well, if there aren't any fastpath users then I'm not bothered about
> removing it from arm64 either. I'm not sure how we establish that, though.

FWIW x86 has never implemented it, which makes me think there's little
demand for it.

I stumbled upon another reason to omit clock_getres from the arm32 vdso.
 If you have CONFIG_HIGHRES_TIMERS=y and the kernel doesn't switch to
high-res mode for whatever reason (this happens for me in qemu), the
vdso clock_getres returns a different result than the syscall does:

# vdsotest clock-getres-monotonic verify
clock resolutions differ:
        [0, 10000000] (kernel)
        [0, 1] (vDSO)

Not sure whether this is a concern for arm64 since I think the only way
to provoke it there is to boot with clocksource=jiffies.
diff mbox

Patch

diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S
index fe652ffd34c2..efa79e8d4196 100644
--- a/arch/arm64/kernel/vdso/gettimeofday.S
+++ b/arch/arm64/kernel/vdso/gettimeofday.S
@@ -174,8 +174,6 @@  ENDPROC(__kernel_clock_gettime)
 /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */
 ENTRY(__kernel_clock_getres)
 	.cfi_startproc
-	cbz	w1, 3f
-
 	cmp	w0, #CLOCK_REALTIME
 	ccmp	w0, #CLOCK_MONOTONIC, #0x4, ne
 	b.ne	1f
@@ -188,6 +186,7 @@  ENTRY(__kernel_clock_getres)
 	b.ne	4f
 	ldr	x2, 6f
 2:
+	cbz	w1, 3f
 	stp	xzr, x2, [x1]
 
 3:	/* res == NULL. */