Linux-MIPS Archive on lore.kernel.org
 help / color / Atom feed
From: "H. Nikolaus Schaller" <hns@goldelico.com>
To: Vincenzo Frascino <vincenzo.frascino@arm.com>
Cc: Paul Burton <paulburton@kernel.org>,
	mips-creator-ci20-dev@googlegroups.com,
	letux-kernel@openphoenux.org, linux-mips@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mips: Fix gettimeofday() in the vdso library
Date: Fri, 29 Nov 2019 15:52:45 +0100
Message-ID: <307717BD-3233-4313-BAA8-7431F4C78773@goldelico.com> (raw)
In-Reply-To: <20191129143658.12224-1-vincenzo.frascino@arm.com>


> Am 29.11.2019 um 15:36 schrieb Vincenzo Frascino <vincenzo.frascino@arm.com>:
> 
> The libc provides a discovery mechanism for vDSO library and its
> symbols. When a symbol is not exposed by the vDSOs the libc falls back
> on the system calls.
> 
> With the introduction of the unified vDSO library on mips this behavior
> is not honored anymore by the kernel in the case of gettimeofday().
> 
> The issue has been noticed and reported due to a dhclient failure on the
> CI20 board:
> 
> root@letux:~# dhclient
> ../../../../lib/isc/unix/time.c:200: Operation not permitted
> root@letux:~#
> 
> Restore the original behavior fixing gettimeofday() in the vDSO library.
> 
> Cc: Paul Burton <paulburton@kernel.org>
> Reported-by: H. Nikolaus Schaller <hns@goldelico.com>
> Testes-by: H. Nikolaus Schaller <hns@goldelico.com> # CI20 with JZ4780
^^^ funny typo... -> Tested-by:
> Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
> ---
> arch/mips/include/asm/vdso/gettimeofday.h | 13 -------------
> arch/mips/vdso/vgettimeofday.c            | 20 ++++++++++++++++++++
> 2 files changed, 20 insertions(+), 13 deletions(-)
> 
> diff --git a/arch/mips/include/asm/vdso/gettimeofday.h b/arch/mips/include/asm/vdso/gettimeofday.h
> index b08825531e9f..0ae9b4cbc153 100644
> --- a/arch/mips/include/asm/vdso/gettimeofday.h
> +++ b/arch/mips/include/asm/vdso/gettimeofday.h
> @@ -26,8 +26,6 @@
> 
> #define __VDSO_USE_SYSCALL		ULLONG_MAX
> 
> -#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
> -
> static __always_inline long gettimeofday_fallback(
> 				struct __kernel_old_timeval *_tv,
> 				struct timezone *_tz)
> @@ -48,17 +46,6 @@ static __always_inline long gettimeofday_fallback(
> 	return error ? -ret : ret;
> }
> 
> -#else
> -
> -static __always_inline long gettimeofday_fallback(
> -				struct __kernel_old_timeval *_tv,
> -				struct timezone *_tz)
> -{
> -	return -1;
> -}
> -
> -#endif
> -
> static __always_inline long clock_gettime_fallback(
> 					clockid_t _clkid,
> 					struct __kernel_timespec *_ts)
> diff --git a/arch/mips/vdso/vgettimeofday.c b/arch/mips/vdso/vgettimeofday.c
> index 6ebdc37c89fc..6b83b6376a4b 100644
> --- a/arch/mips/vdso/vgettimeofday.c
> +++ b/arch/mips/vdso/vgettimeofday.c
> @@ -17,12 +17,22 @@ int __vdso_clock_gettime(clockid_t clock,
> 	return __cvdso_clock_gettime32(clock, ts);
> }
> 
> +#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
> +
> +/*
> + * This is behind the ifdef so that we don't provide the symbol when there's no
> + * possibility of there being a usable clocksource, because there's nothing we
> + * can do without it. When libc fails the symbol lookup it should fall back on
> + * the standard syscall path.
> + */
> int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
> 			struct timezone *tz)
> {
> 	return __cvdso_gettimeofday(tv, tz);
> }
> 
> +#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
> +
> int __vdso_clock_getres(clockid_t clock_id,
> 			struct old_timespec32 *res)
> {
> @@ -43,12 +53,22 @@ int __vdso_clock_gettime(clockid_t clock,
> 	return __cvdso_clock_gettime(clock, ts);
> }
> 
> +#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
> +
> +/*
> + * This is behind the ifdef so that we don't provide the symbol when there's no
> + * possibility of there being a usable clocksource, because there's nothing we
> + * can do without it. When libc fails the symbol lookup it should fall back on
> + * the standard syscall path.
> + */
> int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
> 			struct timezone *tz)
> {
> 	return __cvdso_gettimeofday(tv, tz);
> }
> 
> +#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
> +
> int __vdso_clock_getres(clockid_t clock_id,
> 			struct __kernel_timespec *res)
> {
> -- 
> 2.24.0
> 


  reply index

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-29 14:36 Vincenzo Frascino
2019-11-29 14:52 ` H. Nikolaus Schaller [this message]
2019-11-29 14:58   ` Vincenzo Frascino
2019-11-29 15:09     ` H. Nikolaus Schaller
2019-12-02 19:48 ` Paul Burton

Reply instructions:

You may reply publically 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=307717BD-3233-4313-BAA8-7431F4C78773@goldelico.com \
    --to=hns@goldelico.com \
    --cc=letux-kernel@openphoenux.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=mips-creator-ci20-dev@googlegroups.com \
    --cc=paulburton@kernel.org \
    --cc=vincenzo.frascino@arm.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

Linux-MIPS Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-mips/0 linux-mips/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-mips linux-mips/ https://lore.kernel.org/linux-mips \
		linux-mips@vger.kernel.org
	public-inbox-index linux-mips

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-mips


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git