All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chen-Yu Tsai <wens@kernel.org>
To: Laurent Vivier <laurent@vivier.eu>
Cc: Riku Voipio <riku.voipio@iki.fi>, Chen-Yu Tsai <wens@kernel.org>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] linux-user: Pass through nanosecond timestamp components for stat syscalls
Date: Wed, 22 May 2019 17:45:38 +0800	[thread overview]
Message-ID: <CAGb2v64ArP6sahGosv9Us2NtQGUZsjKpgMt9CJjX=M+JMXZ2nw@mail.gmail.com> (raw)
In-Reply-To: <42b910fa-ca78-0231-db54-f2179fbb827c@vivier.eu>

On Wed, May 22, 2019 at 5:08 PM Laurent Vivier <laurent@vivier.eu> wrote:
>
> On 14/05/2019 16:53, Chen-Yu Tsai wrote:
> > From: Chen-Yu Tsai <wens@csie.org>
> >
> > Since Linux 2.6 the stat syscalls have mostly supported nanosecond
> > components for each of the file-related timestamps.
> >
> > QEMU user mode emulation currently does not pass through the nanosecond
> > portion of the timestamp, even when the host system fills in the value.
> > This results in a mismatch when run on subsecond resolution filesystems
> > such as ext4 or XFS.
> >
> > An example of this leading to inconsistency is cross-debootstraping a
> > full desktop root filesystem of Debian Buster. Recent versions of
> > fontconfig store the full timestamp (instead of just the second portion)
> > of the directory in its per-directory cache file, and checks this against
> > the directory to see if the cache is up-to-date. With QEMU user mode
> > emulation, the timestamp stored is incorrect, and upon booting the rootfs
> > natively, fontconfig discovers the mismatch, and proceeds to rebuild the
> > cache on the comparatively slow machine (low-power ARM vs x86). This
> > stalls the first attempt to open whatever application that incorporates
> > fontconfig.
> >
> > This patch renames the "unused" padding trailing each timestamp element
> > to its nanosecond counterpart name if such an element exists in the
> > kernel sources for the given platform. Not all do. Then have the syscall
> > wrapper fill in the nanosecond portion if the host supports it, as
> > specified by the _POSIX_C_SOURCE and _XOPEN_SOURCE feature macros.
> >
> > Recent versions of glibc only use stat64 and newfstatat syscalls on
> > 32-bit and 64-bit platforms respectively. The changes in this patch
> > were tested by directly calling the stat, stat64 and newfstatat syscalls
> > directly, in addition to the glibc wrapper, on arm and aarch64 little
> > endian targets.
> >
> > Signed-off-by: Chen-Yu Tsai <wens@csie.org>
> >
> > ---
> >
> > This issue was found while integrating some software that uses newer
> > versions of fontconfig into Raspbian images. We found that the first
> > launch of said software always stalls with fontconfig regenerating its
> > font cache files. Upon closer examination I found the timestamps were
> > not matching. The rest is explained above. Currently we're just working
> > around the problem by patching the correct timestamps into the cache
> > files after the fact.
> >
> > Please consider this a drive-by scratch-my-own-itch contribution, but I
> > will stick around to deal with any comments raised during review. I'm
> > not on the mailing lists either, so please keep me in CC.
> >
> > checkpatch returns "ERROR: code indent should never use tabs" for
> > linux-user/syscall_defs.h, however as far as I can tell the whole file
> > is indented with tabs. I'm not sure what to make of this.
>
> Yes, the file is entirely indented with tabs, so you can let this as-is.
> Anyway, I plan to split the file in several ones so we will be able to
> swap the tabs with spaces.
>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>

Thanks. Unfortunately this patch has some issues. It fails to build for
targets that don't have the *_nsec fields, such as Alpha or M68K.

I'll spin a v2 with a new macro TARGET_STAT_HAS_NSEC defined for targets
that have the fields, added before each struct stat definition. The hunk
below will gain a check against said macro. This is pretty much how the
kernel deals with the difference as well, as I just found out.

> > @@ -8866,6 +8876,14 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
> >                   __put_user(st.st_atime, &target_st->target_st_atime);
> >                   __put_user(st.st_mtime, &target_st->target_st_mtime);
> >                   __put_user(st.st_ctime, &target_st->target_st_ctime);
> > +#if _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
> > +                __put_user(st.st_atim.tv_nsec,
> > +                           &target_st->target_st_atime_nsec);
> > +                __put_user(st.st_mtim.tv_nsec,
> > +                           &target_st->target_st_mtime_nsec);
> > +                __put_user(st.st_ctim.tv_nsec,
> > +                           &target_st->target_st_ctime_nsec);
> > +#endif
> >                   unlock_user_struct(target_st, arg2, 1);
> >               }
> >           }

If that sounds good to you I'll keep your reviewed-by for v2.

Thanks
ChenYu


  reply	other threads:[~2019-05-22  9:47 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-14 14:53 [Qemu-devel] [PATCH] linux-user: Pass through nanosecond timestamp components for stat syscalls Chen-Yu Tsai
2019-05-14 17:25 ` no-reply
2019-05-22  9:08 ` Laurent Vivier
2019-05-22  9:45   ` Chen-Yu Tsai [this message]
2019-05-22 12:06     ` Laurent Vivier

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='CAGb2v64ArP6sahGosv9Us2NtQGUZsjKpgMt9CJjX=M+JMXZ2nw@mail.gmail.com' \
    --to=wens@kernel.org \
    --cc=laurent@vivier.eu \
    --cc=qemu-devel@nongnu.org \
    --cc=riku.voipio@iki.fi \
    /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.