unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: Alistair Francis <alistair23@gmail.com>
Cc: GNU C Library <libc-alpha@sourceware.org>,
	Alistair Francis <alistair.francis@wdc.com>,
	 Lukasz Majewski <lukma@denx.de>
Subject: Re: 32-bit time_t inside itimerval
Date: Sat, 21 Dec 2019 13:31:16 +0000	[thread overview]
Message-ID: <CAK8P3a0KR3-_DCYob0VH3BWjDNxEbz9Qt-ygtSuVFDC6PRL8Fw@mail.gmail.com> (raw)
In-Reply-To: <CAKmqyKPki9K3JwYT4zn7JaAZHFW8UO7ztS2D=US3ccnTd-KAwA@mail.gmail.com>

On Fri, Dec 20, 2019 at 10:35 PM Alistair Francis <alistair23@gmail.com> wrote:
>
> Hey,
>
> I just noticed something strange.
>
> The setitimer syscall is not different for 32/64-bit time_t. So we use
> this syscall for both 32/64 time_t [1]
>
> SYSCALL_DEFINE3(setitimer, int, which, struct itimerval __user *, value,
>         struct itimerval __user *, ovalue)
>
> Where struct itimerval __user *, value looks like this [2]:
>
> struct itimerval {
>     struct timeval it_interval;    /* timer interval */
>     struct timeval it_value;    /* current value */
> };
>
> Which then uses this structure for timeval [3]:
>
> struct timeval {
>     __kernel_old_time_t    tv_sec;        /* seconds */
>     __kernel_suseconds_t    tv_usec;    /* microseconds */
> };
>
> And __kernel_old_time_t is defined [4] as:
>
> typedef __kernel_long_t    __kernel_old_time_t;
> typedef __kernel_long_t    __kernel_time_t;

Right, with my latest patches, this gets changed to __kernel_old_timeval, with
an unmodified definititon.

> So __kernel_old_time_t and __kernel_time_t are both 32-bit values
> inside the kernel. and the setiimer syscall expects a 32-bit time_t
> for the values inside it.
>
> This is different to the current glibc implementation where all time_t
> values are treated as 64-bit for RISC-V [5].
>
> What should we do here?
>
> 1. Change glibc to use a 32-bit time_t for some structures, such as
> the timeval inside itimerval?
> 2. Convert the kernel time_t to be 64-bit for RV32?

What happened here is that originally I thought we would not need
setitimer/getitimer
and could fall back to timer_settime/timer_gettime, but that turned out to be a
misunderstanding (we do need both).

By the time we introduced all the other system calls with 64-bit
time_t in linux-5.1,
there was no replacement yet, but since these interfaces never pass
absolute times
on the kernel ABI, it was considered good enough. There was a small debate on
whether struct itimerval and struct rusage (which has the same problem) should
have replacements using struct __kernel_timespec, or a newly added
__kernel_timeval, and that discussion never had a conclusion, so we
left it at this.

For glibc, the only sensible implementation is to implement the time64
settimer/getitimer interfaces on top of the time32 setitimer/getitimer
system calls,
doing the conversion internally. (Same for getrusage and wait4).

We may still want to introduce getitimer_time64, setiitimer_timer64,
getrusage_time64 and waitid_time64 at some point, using __kernel_timespec
to have a saner user space interface, but there is no real point in glibc
using those syscalls as the underlying implementation when the fallback
to the time32 versions is still required.

        Arnd

  reply	other threads:[~2019-12-21 13:31 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-20 22:28 32-bit time_t inside itimerval Alistair Francis
2019-12-21 13:31 ` Arnd Bergmann [this message]
2019-12-21 17:18   ` Alistair Francis
2019-12-30 10:02     ` Arnd Bergmann
2019-12-30 19:51       ` Alistair Francis
2019-12-30 20:11         ` Arnd Bergmann
2019-12-30 21:16           ` Alistair Francis
2019-12-30 22:11             ` Arnd Bergmann
2020-01-02 12:08               ` Lukasz Majewski
2020-01-02 12:28                 ` Arnd Bergmann
2020-01-04 18:03                   ` Alistair Francis
2020-01-05 16:07                     ` Lukasz Majewski

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

  List information: https://www.gnu.org/software/libc/involved.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAK8P3a0KR3-_DCYob0VH3BWjDNxEbz9Qt-ygtSuVFDC6PRL8Fw@mail.gmail.com \
    --to=arnd@arndb.de \
    --cc=alistair.francis@wdc.com \
    --cc=alistair23@gmail.com \
    --cc=libc-alpha@sourceware.org \
    --cc=lukma@denx.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).